首页 > 解决方案 > 为什么必须在 Eden 空间中创建新的 Java 对象?

问题描述

Java 垃圾收集对年轻对象使用副本收集器。Young Generation区域分为“Eden Space”和两个Survivor Spaces,s0和s1。

我知道复制收集器将幸存对象从伊甸园和一个幸存者空间复制到另一个幸存者空间。

从概念上讲,2 个空格就足够了,将幸存者从一个空格复制到另一个空格。我假设 Java 使用 3 个空格而不是 2 个空格的原因是,新对象总是可以在同一个地方创建,在伊甸园区域。

问题是为什么在伊甸园区域创建新的(年轻空间)对象很重要,而不是在“复制到”幸存者空间中的最后一个复制对象之后?

标签: javagarbage-collectionjvm

解决方案


您提出的替代方案有两个大小相等的新空间,并从一个复制到另一个。当(总)新空间填满一半时,您会发现需要运行新一代 GC。

在 Oracle GC 使用的方法中,(通常)Eden size > S1 size + S2 size,当您运行新一代 GC 时,您已经填满了所有 Eden + S1(或 S2)的一部分。这将大大超过总新空间内存的一半。换言之,新空间内存的使用效率更高。

这个 Oracle 培训材料有一些很好的图表来解释在新老代 GC 期间发生的事情:

但请注意,本教程描述的是简化的分代收集器。不同版本的 Java 支持的各种实际收集器的细节差异很大。


推荐阅读