gpt4 book ai didi

java - 为什么必须在 Eden 空间中创建新的 Java 对象?

转载 作者:行者123 更新时间:2023-11-29 08:21:10 27 4
gpt4 key购买 nike

Java Garbage Collection 对年轻对象使用复制收集器。新生代区域分为“Eden Space”和两个Survivor Spaces,s0和s1。

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

从概念上讲,2 个空格就足够了,将幸存者从一个空格复制到另一个空格。我假设 Java 使用 3 个空格而不是仅仅 2 个的原因是为了始终可以在 Eden 区域的同一位置创建新对象。

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

最佳答案

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

在 Oracle GC 使用的方法中,(通常)Eden 大小 > S1 大小 + S2 大小,当你运行新一代 GC 时,你已经填满了整个 Eden + 部分 S1(或 S2)。这将大大超过新空间内存总量的一半。换句话说,新空间内存的使用效率更高。

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

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

关于java - 为什么必须在 Eden 空间中创建新的 Java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58014748/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com