在堆中创建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
所以我的问题是,在这些移动操作之后,应该更改内存中的地址以及对象引用为何仍然有效?
答案 0 :(得分:7)
如果GC决定移动一个对象,它有责任更新对该对象的所有引用。
这对Java程序员来说是透明的:他们可以将引用视为抽象句柄,而不用担心JVM如何管理对象存储。
答案 1 :(得分:3)
Java中的对象引用是一个抽象概念。它们不仅仅是表示C ++指针等内存偏移的整数。 Java虚拟机抽象对它指向的对象的访问,因此您不必担心JVM如何在内部管理其内存。
答案 2 :(得分:-3)
地址不会更改,因为正在移动对象引用而不是对象。