垃圾回收后对象引用会改变吗?

6

我对垃圾收集(GC)还有点疑惑,当GC执行时会停止所有线程并收集Garbage references。

GC之后,JVM是否执行任何压缩操作(compaction)?

压缩:意味着移动“正在使用”的内存区域以消除由终止引用引起的空洞。

如果是这样,JVM是否保留旧引用,还是为所有剩余的对象分配新引用?


1
我添加了Java作为语言,因为你提到了JVM。但是如果你指的是其他东西(例如Scala),请正确标记。 - Bathsheba
谢谢您的建议。 - Greesh Kumar
1个回答

8
关于内存压缩:这取决于所使用的算法。由于所有年轻代GC都是复制收集器:是的,它们会进行内存压缩,甚至将所有幸存对象重新定位到不同的存储区域。对于老年代GC,这取决于使用哪种收集算法。虽然标准的标记-清除-压缩收集器是可以进行压缩的(这就是为什么有“压缩”一词),但CMS收集器(并发标记清除)通常不会进行任何压缩,除非无法避免并且因此必须管理堆碎片。
当对象被移动时(无论是因为使用复制收集器还是因为进行内存压缩),现有的引用将被更新以指向新的内存位置。

你可以轻松地更新局部变量、类实例和对象数组实例的引用。但JVM如何处理推送到操作数栈的引用? - neoexpert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接