4

これはばかげているように聞こえるかもしれませんが、Javaスタックとメモリヒープについてはまだはっきりしていません。私が勉強して知っていることは次のとおりです。

1)すべてのメソッド呼び出しはスタックになります。

2)ローカルに割り当てられたすべてのメモリはメモリヒープに配置されます(この点についてはあまり明確ではありません)

3)new演算子(メソッドまたはクラスのいずれか)によって割り当てられたすべてのメモリは、メモリヒープに格納されます。

私は以下のケースについて心配しています:

1)メソッドでint変数を作成して返す場合、それはどこに行きますか(スタックに入ると思いますが、明確にする必要があります)。

2)メソッドに新しいオブジェクトを作成すると、メソッドの実行が終了した後も存在するヒープメモリに保存されます(これは、このオブジェクトを一部に割り当てたときに、Javaによって作成されたオブジェクトのハッシュコードが同じままであるために発生することを理解しています外部参照変数またはこのオブジェクトを返します)。

3)私の問題は、ポイント2で説明したオブジェクトを参照に割り当てていない場合、またはこれを返さない場合にどうなるかです。それはまだヒープ上に作成されていますか?論理的にはそうあるべきですが、私に教えてください。

4

2 に答える 2

8

すべてのメソッドパラメータはスタックに配置されます。すべてのローカル変数はスタックに配置されます。newヒープに入るのは、明示的に(または自動ボクシングやvarargsによって暗黙的に)割り当てられたものだけです。

別の見方をすれば、プリミティブ値とオブジェクト/配列参照はスタックに入る可能性がありますが、実際のオブジェクトは1になりません。

それで:

1)-プリミティブ値(変数ではありません!)を返し、スタックに格納されます。(変数を「返す」ことはできません。変数はスタックフレームの一部であり、スタックフレームから切り離すことはできません。)

2)はい。

3)はい、少なくとも今のところ1。ある時点で、GCが実行され、アプリケーションにオブジェクトへの参照がなくなったことに気づき、それを再利用する場合があります。


1-実際、最新のHotspotコンパイラは、オブジェクトの参照がそれを作成するメソッドから「エスケープ」されないこと、およびオブジェクトがスタックに割り当てられる可能性があることを検出できます。IIRC、この最適化(エスケープ分析と呼ばれる)は、JVMコマンドラインフラグを使用して有効にする必要があります。

于 2012-05-17T03:56:39.443 に答える
1

コードセグメント:定数値は、多くの場合、プログラムコードセグメントに直接配置されます。

スタック:オブジェクト参照とプリミティブ変数はスタックに配置されます。

ヒープ:オブジェクトを作成するたびに、そのコードが実行されるときにストレージがヒープに割り当てられます。

あなたの質問のために:

1)はい

2)はい

3)はい

于 2012-05-17T05:33:09.307 に答える