原因是,您猜对了,性能。首先让我解释一下为什么还存在幸存者空间。关于 对象重定位 的基本考虑,有两种主要的垃圾收集器设计:
就地 压实 收集器;
一个 拷贝 收集器。
基本上,因为它永远不会覆盖任何对象,所以复制收集器可以更快地运行并可以有效地并行化。如果不使用一个“活动”堆空间和一个“休眠”堆空间,那么在每次GC运行之后这两个转换角色就无法实现。
复印收集器的基本设计
注意:以下内容 不是 对HotSpot实际GC的描述,而是CJ
Cheney在1970年ACM论文中介绍的原始设计的那些方面。HotSpot进行了进一步的改进,其中之一是添加了下面说明的 Eden 空间。
复制收集过程开始时,涉及两个空格:
- 从 空间:连续的内存块分为两个区域:
- 上届GC的幸存者;
- 新对象(自上次GC后创建);
- 到 空间:完全空了。
GC运行的任务是在“ 起始” 空间中识别所有尚存的对象并将其复制到“目标 ” 空间。
随着“ 到” 空间的建立,“ 从” 空间将被完全撤离,并且无需向其写入任何内容。
单次 复制GC __
复制收集器的主要优点是它是单遍的:我们只需扫描所有GC根目录,复制所有这些对象,然后扫描这些对象以获取进一步的引用,然后复制所有引用对象。我们从不重访任何对象,也不需要任何支持的内存结构。(请
在此处对此进行详细说明)。
前向指针
随着每个生存对象的重定位,可以用 转发指针
标记旧位置,然后在扫描生存对象以查找对重定位对象的引用并更新这些引用时,可以有效地使用此信息。旧参考指向前向指针,因此新指针值仅需查找一次。
为什么要第三个空间?
您的问题是:“为什么有两个幸存者空间?” 实际上最好用“为什么要使用单独的 伊甸园 空间”这样的表述呢?
HotSpot引入了作为优化的 Eden 空间,该空间使新分配区域的容量保持恒定,并押注了这样一个结果,即大部分对象将立即变成垃圾。您可以将
Eden 视为 两个空间之间 共享 的一部分内存,这部分内存可能在下一个GC时释放。这实际上提高了内存利用率。



