web-dev-qa-db-ja.com

オブジェクトのインスタンス変数は、JVMのどこに保存されますか?

Javaにあるオブジェクトのインスタンス変数は、JVMのスタックまたはメソッド領域に格納されていますか?

また、複数のスレッドに対して異なるインスタンス変数がありますか?

メソッド領域に格納されている場合、インスタンス変数は静的変数ストレージとどのように異なりますか?

15
saurabh goyal

Stackおよびheapは、OSによってJVMに割り当てられたメモリです。システムで実行されます。Stackは、メソッドとローカル変数が格納されるメモリ場所です。 (変数参照primitiveまたはobject参照もスタックに格納されます)。 Heapは、オブジェクトとそのインスタンス変数が格納されるメモリ場所です。

要約すると:

  • メソッドコードと静的フィールドを含むクラスオブジェクト:ヒープ。
  • インスタンスフィールドを含むオブジェクト:ヒープ。
  • ローカル変数とメソッドの呼び出し:スタック

また、複数のスレッドに対して異なるインスタンス変数がありますか?

すべてのスレッドにはプログラムカウンター(PC)とJavaスタックがあります。PCはJavaスタックを使用して中間値、動的リンク、戻り値を格納しますメソッドとディスパッチ例外の場合、これはレジスタの代わりに使用されます。

また、スレッドの詳細については、このトピックを必ずお読みください スレッドオブジェクトはどこに作成されますか?スタックまたはヒープ?

メソッド領域に格納されている場合、インスタンス変数は静的変数ストレージとどのように異なりますか?

上記のように静的フィールドはヒープに格納されます。一方、ローカル変数はスタックに格納されます。

//編集

Bruno Reis および Peter Lawrey のコメントによると、エスケープ分析についても読む必要があります

  1. ウィキペディア
  2. 仮想マシンのパフォーマンスの向上、エスケープ分析
20
Matej Špilár

正確には、

  • インスタンス変数はヒープに格納されます。
  • スタック上のローカル変数(変数の場合プリミティブではない [参照変数]参照変数はスタック上にあります
    およびヒープ上のオブジェクト)。メソッドの呼び出しと部分的な結果のみが、メソッド自体ではなくスタックに格納されます。
  • メソッド領域の静的変数とメソッド(静的および非静的を含む)。

リファレンス:Head First Java

4
Jayanth