4

Java オブジェクトはヒープで作成され、ヒープは Java でのガベージ コレクションのために 3 つの部分または世代に分割されます。これらはヤング ジェネレーション、Tenured または Old ジェネレーション、およびヒープの Perm 領域と呼ばれます。ニュージェネレーションはさらに、エデンスペース、サバイバー1、サバイバー2スペースと呼ばれる3つの部分に分かれています。ヒープで最初に作成されたオブジェクトは、Eden 空間内の新しい世代で作成され、その後のマイナー ガベージ コレクションの後、オブジェクトが生き残った場合はサバイバー 1 に移動され、メジャー ガベージ コレクションがそのオブジェクトを古い世代または旧世代に移動する前にサバイバー 2 に移動されます。

詳細: http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz2MeKK2gBA

だから私の質問は、これらの移動アクションの後、メモリ内のアドレスを変更する必要があり、なぜオブジェクト参照がまだ有効なのですか?

4

3 に答える 3

7

GC がオブジェクトの移動を決定した場合、GC はそのオブジェクトへのすべての参照を更新する責任があります。

これは、Java プログラマーには透過的です。参照を抽象ハンドルとして扱うことができ、JVM がオブジェクト ストレージを管理する方法について心配する必要はありません。

于 2013-03-05T07:55:26.110 に答える
4

Java のオブジェクト参照は抽象的な概念です。これらは、C++ ポインタのようなメモリ オフセットを表す単なる整数ではありません。Java 仮想マシンは、それが指すオブジェクトへのアクセスを抽象化するため、JVM が内部でメモリを管理する方法について心配する必要はありません。

于 2013-03-05T07:57:25.440 に答える
-3

オブジェクトではなくオブジェクト参照が移動されるため、アドレスは変更されません。

于 2013-03-05T08:00:27.727 に答える