首页 > 解决方案 > 在 mark-sweep-compact 的紧凑阶段之后,空闲的内存块是否会进入 Eden?

问题描述

据我了解,堆中有一个用于年轻对象的实心空间和一个用于旧对象的实心空间。对象在收集期间在两个区域中移动,但在第二个区域中,它们也被压缩。我的问题是为什么它们被压实,释放的固体区域是用来做什么的,伊甸园还是新的大旧物体?

标签: javagarbage-collection

解决方案


让我们看一下 HotSpot 堆(其他实现可能不同)。

年轻代分为三个区域,伊甸园空间和两个幸存者空间。大多数对象最初是使用简单(非常快速)的指针碰撞方法在 Eden 空间中分配的。为避免线程争用,每个应用程序线程都有自己的线程本地分配块 (TLAB)。当 GC 在这里发生时,活动对象被复制到幸存者空间之一。在被复制到老年代之前,活对象在幸存者空间之间被复制多次(由tenuring threshold确定)。这就是在次要 GC 期间移动对象的方式。

不同的算法以不同的方式处理老年代的 GC(主要 GC)。例如,CMS 识别活动对象之间的间隙并将它们添加到列表中,以便为正在提升的对象分配空间。在某些时候,碎片变得太大,并且会发生完整的压缩收集。在此期间,所有对象都被重新定位为在堆底部是连续的,因此没有间隙。

为了回答你的问题,老一代被压缩以消除碎片。然后,压缩数据上方的内存区域将用于在次要 GC 期间提升的对象。年轻一代和老一代保持分离。


推荐阅读