在GC之后,内存中对象的地址会被更改以及对象引用为何仍然有效?

时间:2013-03-05 07:51:53

标签: java garbage-collection

  

在堆中创建Java对象,堆分为三个部分   或者为了Java中的垃圾收集,这些都是   被称为年轻一代,终身或老一代和烫发地区   堆。新一代又分为三个部分   伊甸园空间,幸存者1和幸存者2空间。当一个对象第一时   在堆中创建它在Eden空间内的新一代中创建   并且在随后的Minor Garbage收集之后,如果对象存活了它   在Major Garbage之前被转移到幸存者1然后是幸存者2   collection将该对象移动到Old或tenured generation。

了解详情:http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz2MeKK2gBA

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

3 个答案:

答案 0 :(得分:7)

如果GC决定移动一个对象,它有责任更新对该对象的所有引用。

这对Java程序员来说是透明的:他们可以将引用视为抽象句柄,而不用担心JVM如何管理对象存储。

答案 1 :(得分:3)

Java中的对象引用是一个抽象概念。它们不仅仅是表示C ++指针等内存偏移的整数。 Java虚拟机抽象对它指向的对象的访问,因此您不必担心JVM如何在内部管理其内存。

答案 2 :(得分:-3)

地址不会更改,因为正在移动对象引用而不是对象。