- PR -

JVMのメモリ管理について

1
投稿者投稿内容
J
会議室デビュー日: 2006/06/30
投稿数: 6
投稿日時: 2006-06-30 14:10
現在Javaのメモリ構造について調べていますが、不明な点があるので教えてください。
【フィールドの実体】
参照型のインスタンスフィールド(A)はオブジェクトがnewされた時点(@)でヒープ領域に実体が格納され、それを指す変数aはメソッドエリア(コンスタントプール)のクラス情報に保持していると思っています。
プリミティブ型のインスタンスフィールド(B)の場合は実体はどこにあるのでしょうか?参照型と同じようにヒープ領域に格納されているのでしょうか?ヒープ領域はオブジェクトの実体が格納されている場所だと考えると違う気がします。
ローカル変数の場合の参照型の実体はヒープ領域でそれを指す変数はフレーム内のスタック領域に格納され、またプリミティブ型については実体もスタック領域に格納されていると認識しております。
また、staticフィールドの実体はメソッドエリアですか?
ヒープ領域はGCの対象となるとなりますが、staticフィールド/メソッドはGC対象外だと思っていますので。

class Sample{
A a = new A(); ・・・@生成
}

class A{
B b = null; ・・・A参照型
int cnt = 0; ・・・Bプリミティブ型
static C c = null; ・・・B参照型static
static int s = 0; ・・・Cプリミティブ型static
}
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-06-30 14:31
実体の格納場所については詳しくありませんが、
引用:

また、staticフィールドの実体はメソッドエリアですか?
ヒープ領域はGCの対象となるとなりますが、staticフィールド/メソッドはGC対象外だと思っていますので。


について。

staticフィールドに格納されたインスタンスはGCの対象になりますよ。
そのインスタンスが、そのstaticフィールド以外から強到達できない場合、
その時点では到達可能ですから、GCの対象とはなりません。
(スレッド等>クラスローダ>クラス>フィールドと到達が可能)

しかし、そのフィールドをもつクラスそのものが強到達不可能となった場合、
クラスがGCの対象となり、そのフィールドに格納されたインスタンスも強到達不可能になります。
その場合、そのフィールドもGCの対象となります。
ちなみに、クラスがGCの対象となるケースは、
そのクラスをロードしたクラスローダが強到達不可能になった場合です。
(Tomcatのアプリケーションのリロードなど)

余談ですが、JDK6.0からインスタンスがメソッドの中から参照が逃げないと判断された場合、
ヒープ領域ではなくスタック領域が利用されます。
(エスケープ解析というものです。)
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-06-30 15:09
引用:

参照型のインスタンスフィールド(A)はオブジェクトがnewされた時点(@)でヒープ領域に実体が格納され、それを指す変数aはメソッドエリア(コンスタントプール)のクラス情報に保持していると思っています。


変数aはSampleクラスのインスタンスのフィールドなんだから、そのインスタンスがある場所、つまり通常はヒープ領域にあるのでは? プリミティブの値も同じ。
J
会議室デビュー日: 2006/06/30
投稿数: 6
投稿日時: 2006-06-30 16:08
引用:
変数aはSampleクラスのインスタンスのフィールドなんだから、そのインスタンスがある場所、つまり通常はヒープ領域にあるのでは? プリミティブの値も同じ。



変数aの実体はヒープ領域にありますが、実体を指す変数がメソッドエリアのクラスファイルの情報にあると思っています。プリミティブは同じように実体はヒープ領域なんですか?ローカル変数のプリミティブ型の実体はスタック領域にあると思っていましたがそれも間違いでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)