Abh*_*hek 8 java performance garbage-collection
在大多数在线教程中,我们可以看到它们显示GC中有两个幸存者空间.当我们实际上只有一个时,需要有两个幸存者空间?拥有两个幸存者空间对性能有何影响?
Mar*_*nik 25
原因是,你猜对了,表现.让我首先解释为什么存在幸存者空间.关于对象重定位的基本关注点,有两种主要的垃圾收集器设计:
就地压实收集器;
一个拷贝收集器.
复制收集器可以更快地运行并且可以有效地并行化,主要是因为它永远不会覆盖任何对象.如果不使用一个"活动"和一个"休眠"堆空间,在每次GC运行后这两个切换角色都无法实现.
注意:以下内容不是 HotSpot实际GC的描述,而是CJ Cheney在1970年ACM论文中提出的原始设计的一部分.HotSpot增加了进一步的改进,其中之一是增加了下面解释的Eden空间.
复制收集过程开始时,涉及两个空格:
GC运行的任务是识别From空间中所有幸存的对象,并将它们复制到To空间.
随着To空间的建立,From空间将完全撤离,无需写入任何内容.
复制收集器的一个关键优势是它是单通道的:我们只扫描所有GC根,复制所有这些对象,然后扫描这些对象以进一步引用,复制所有指示对象.我们从不重新访问任何对象,也不需要任何支持内存结构.(看 这里有一个很好的解释).
当每个幸存的对象被重新定位时,旧的位置可以用转发指针标记,然后可以有效地使用该信息,因为扫描幸存的对象以引用重新定位的对象,并更新那些引用.旧引用指向前向指针,因此新指针值只是一次查找.
你的问题,"为什么有两个幸存者空间?" 实际上更好的措辞,"为什么一个单独的伊甸园空间?".
HotSpot引入了Eden空间作为优化,使新分配区域的容量保持不变,并注意大部分对象将立即变成垃圾的结果.您可以将Eden视为 两个空间之间共享的内存的一部分 - 可能在下一个GC上释放的部分.这实际上提高了内存利用率