4

Java 对象是在 Heap 中创建的,为了在 Java 中进行垃圾回收,Heap 分为三部分或代,这些部分称为年轻代、Tenured 或 Old Generation 和堆的 Perm 区域。新一代进一步分为伊甸园空间、幸存者 1 和幸存者 2 空间三个部分。当一个对象首次在堆中创建时,它会在 Eden 空间内的新一代中创建,如果对象幸存,则在随后的 Minor Garbage 收集之后将其移动到幸存者 1,然后在主要垃圾收集将该对象移动到旧代或终身代之前的幸存者 2。

阅读更多:http: //javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz2MeKK2gBA

所以我的问题是,在这些移动动作之后,内存中的地址应该改变,为什么对象引用仍然有效?

4

3 回答 3

7

如果 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 回答