2

オブジェクトには、他のオブジェクトへの参照を含めることができます。これらの参照をクラス/フィールド変数として宣言すると、オブジェクト自体がヒープ上に作成されるため、フィールド参照によって表される値がヒープに格納されます。

だから、私が持っている場合

public class A {
    int size;
}
  • sizeがint値を取得した場合、それはヒープ上のオブジェクトの一部として格納されることを知ってい2ますが、参照、つまり名前sizeはどこに格納されますか?
  • 「サイズ」という名前は、ヒープ上のオブジェクトの内部にも格納されていますか。
  • size == 2JVMはヒープ上でどのように相互参照しますか?
  • クラスをロードすると、クラスはメインスレッドで実行され、各スレッドには独自のスタックがあります。したがって、これらのフィールド参照はメインスタックに作成されませんか?
4

1 に答える 1

1

「サイズ」という名前はどこに保存されていますか?

フィールドの名前は、Classオブジェクトに格納されますA.classjava.lang.reflectライブラリを使用して、クラスのフィールド名を調べることができます。

たとえば、クラスのすべてのフィールドを検査するには、次のようにします。

for (Field field : A.class.getFields()) {
    String fieldName = field.getName();
    Class<?> fieldClass = field.getType();
    // etc
}

「サイズ」という名前もヒープ上のオブジェクト内に格納されていますか?

いいえ。permgenメモリに保存されます

ヒープ上でJVM相互参照サイズ==2はどのようになりますか?

コンパイル時にフィールドを検索し、残りはバイトコードで実行されます

フィールド参照はメインスタックに作成されませんか?

いいえ。ヒープとスタックだけでなく、より多くのメモリ領域があります。クラス定義とクラスフィールドが格納されるpermgenもあります。ガベージコレクターなど、さらに多くのメモリ領域があります。

于 2012-07-27T01:00:36.197 に答える