Java VM是否会在内存中移动对象?

Java VM是否会在内存中移动对象?,第1张

Java VM是否会在内存中移动对象

参考上面关于遍历堆的注释。

不同的GC采取不同的方式。

通常,在遍历堆时复制收集器,但它们不会遍历堆中的所有对象。相反,它们将实况对象放在堆中。含义是,如果可以从“根”对象访问该对象,则该对象是活动的。

因此,在此阶段无论如何都要触摸所有活动对象,因为它会将它们从旧堆复制到新堆。一旦完成活动对象的复制,旧堆中剩下的全部就是已经复制的对象或垃圾。到那时,旧堆可以被完全丢弃。

这种收集器的两个主要好处是,它在复制阶段压缩了堆,并且仅复制了活动对象。这对于许多系统而言很重要,因为使用这种收集器,对象分配非常便宜,实际上只不过是增加堆指针而已。当发生GC时,不会复制任何“死”对象,因此它们不会降低收集器的速度。事实证明,在动态系统中,临时垃圾比长期存在的垃圾要多得多。

此外,通过遍历活动对象图,您可以看到GC如何“了解”每个对象,并跟踪它们,以便在复制期间执行任何地址调整用途。

这不是一个讨论GC机理的论坛,因为这不是一个小问题,但这是复制收集器工作原理的基础。

世代复制的GC将把“较旧”的对象放在不同的堆中,与“较新”的堆相比,最终收集这些对象的频率降低了。从理论上讲,持久耐用的物体会被提升到较老的世代,并且越来越少地被收集,从而提高了整体GC的性能。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5616194.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存