在mark-sweep-compact的压缩阶段之后,空闲的内存块会进入Eden吗?

时间:2019-02-12 18:37:53

标签: java garbage-collection

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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