java - 为什么必须在 Eden 空间中创建新的 Java 对象?
问题描述
Java 垃圾收集对年轻对象使用副本收集器。Young Generation区域分为“Eden Space”和两个Survivor Spaces,s0和s1。
我知道复制收集器将幸存对象从伊甸园和一个幸存者空间复制到另一个幸存者空间。
从概念上讲,2 个空格就足够了,将幸存者从一个空格复制到另一个空格。我假设 Java 使用 3 个空格而不是 2 个空格的原因是,新对象总是可以在同一个地方创建,在伊甸园区域。
问题是为什么在伊甸园区域创建新的(年轻空间)对象很重要,而不是在“复制到”幸存者空间中的最后一个复制对象之后?
解决方案
您提出的替代方案有两个大小相等的新空间,并从一个复制到另一个。当(总)新空间填满一半时,您会发现需要运行新一代 GC。
在 Oracle GC 使用的方法中,(通常)Eden size > S1 size + S2 size,当您运行新一代 GC 时,您已经填满了所有 Eden + S1(或 S2)的一部分。这将大大超过总新空间内存的一半。换言之,新空间内存的使用效率更高。
这个 Oracle 培训材料有一些很好的图表来解释在新老代 GC 期间发生的事情:
但请注意,本教程描述的是简化的分代收集器。不同版本的 Java 支持的各种实际收集器的细节差异很大。
推荐阅读
- javascript - 如何获取属性的值?
- css - 添加了 4 个字体文件,但只显示了 2 个样式
- javascript - 对 indexOf 在 JS 中的工作方式感到困惑
- ios - iPhone6S 中未显示“仅添加照片”权限选项,即使在 plist 中添加“照片库添加使用说明”后也是如此
- vue.js - 如何查看 vuex 状态?
- javascript - 将网页转换为 pdf,包括谷歌地图但地图未显示
- c++ - 使用boost python编译在python代码内部调用的c ++代码时出错
- proxy - 让 mysql 客户端使用 ALL_PROXY socks5 服务器
- jquery - 我在 jquery 中使用 split 函数,但我没有得到在给定条件下如何拆分字符串?
- database - 在 Docker 上备份和迁移 MongoDB Scehma