2011-12-21 18 views
5

私は現在、java、スタック、ヒープのメモリの概念を学んでいますが、ローカル変数とメソッド呼び出しはスタックと呼ばれる場所に住んでいました。オブジェクトはヒープ内に存在します。そのローカル変数がオブジェクトを保持している場合はどうなりますか?またはオブジェクト参照を持っていますか?Javaローカル変数、オブジェクト参照、インスタンス変数はどこにありますか

public void Something(){ 
     Duck d = new Duck(24); 
} 

まだスタック内には存在しますか?インスタンス変数はどこにありますか?できるだけシンプルにしてください。ありがとうございました。

答えて

11

ローカル変数d(スタックに割り当てられます)には、クラスDuckのオブジェクトへの参照が含まれています。一般に、オブジェクトはヒープに割り当てられます。

Java 6e14では、「エスケープ解析」と呼ばれる機能が追加されました。 -XX:+DoEscapeAnalysisスイッチでそれを有効にすると、メソッドでオブジェクトが作成され、そのメソッドでのみ使用され、そのメソッドをエスケープするためのオブジェクトへの参照方法がないとJVMが判断した場合、つまり、メソッドが完了した後にオブジェクトが参照されないこと - JVMはスタックにそれを割り当てます(すべてのフィールドをローカル変数のように扱います)。これはおそらくあなたの例で起こります。

フィールドは、オブジェクトの残りの部分に割り当てられます。したがって、エスケープ解析の結果に応じて、ヒープまたはスタック上にフィールドが割り当てられます。

+0

は、オブジェクト内に割り当てられていますか?またはヒープのソロのように? – KyelJmD

+0

オブジェクトがインスタンス変数として作成されても、それでもエスケープ解析に該当する場合はどうなりますか? – KyelJmD

+0

メモリ内のオブジェクトのレイアウトは次のようになります:8バイトのヘッダ、次に属性。インスタンス変数がプリミティブではなくオブジェクトである場合、ポインタのみが連続したメモリブロックに格納され、オブジェクトは他の場所に割り当てられます。 – socha23

2

オブジェクト参照変数が機能します。プリミティブ変数と同じように、参照がローカル変数として宣言されている場合はスタックに移動します。refrenceがインスタンス変数であれば、オブジェクト内のヒープに入ります。

関連する問題