
1.3.2.1. 新生代的标记和压缩仍需要暂停所有应用程序线程
1.3.2.2. 老年代的压缩也是在应用程序线程暂停期间发生的
1.5.2.1. 第一个阶段
1.5.2.1.1. JDK 8中被称为初始标记(initial mark)
1.5.2.1.2. JDK 11中被称为并发开始(concurrent start)
1.5.2.1.2.1. 大小以区域为单位,而不是MB
1.5.2.1.2.2. 一个新的区域:巨型对象区域,是老年代的一部分
1.5.2.1.3. 暂停所有的应用程序线程
1.5.2.2. 重新标记(remark)阶段
1.5.2.3. 正常的清理(cleanup)阶段
1.5.3.1. 混合垃圾回收
1.5.3.2. 执行正常的新生代回收时,也会回收后台扫描时标记的一些区域
1.5.3.3. 在JDK 11中,首次Mixed GC被标记为Prepared Mixed,紧接着是并发清理
1.5.3.4. 将执行多次,持续到(几乎)所有标记的区域都完成回收,恢复常规的Young GC周期
1.5.4.1. 并发模式失败(concurrent mode failure)
1.5.4.1.1. 老年代在这个标记周期完成之前被填满了
1.5.4.1.2. 应该增加堆的大小
1.5.4.1.3. G1 GC的后台处理必须更快
1.5.4.1.4. 必须优化标记周期以更快地运行
1.5.4.2. 晋升失败(promotion failure)
1.5.4.2.1. 已经开始执行Mixed GC以清理老年代的区域。在它还没有清理出足够的空间之前,有太多的对象从新生代晋升,以至于老年代的空间还是用完了
1.5.4.2.2. 混合回收需要执行得更快
1.5.4.2.3. 每次新生代回收都需要处理更多的老年代区域
1.5.4.3. 疏散失败(evacuation failure)
1.5.4.3.1. 堆已经非常满了或者碎片化很严重
1.5.4.3.2. 增加堆的大小
1.5.4.4. 巨型对象分配失败(humongous allocation failure)
1.5.4.5. 元数据GC阈值(metadata GC threshold)
1.5.4.5.1. 元空间本质上是一个独立的堆,并且独立于主堆进行回收
1.5.4.5.2. 在JDK 8中,当它需要进行回收时,G1 GC会在主堆上执行Full GC(紧跟着新生代回收)
1.5.4.5.3. 在JDK 11中,元空间可以被回收,也可以调整大小,而不必进行Full GC
2.9.2.1. 影响用于并发标记的线程数量
2.9.2.2. 如果有额外的CPU可用
2.9.2.3. 计算方式
2.9.2.3.1. ConcGCThreads = (ParallelGCThreads + 2) / 4
2.9.2.3.2. 基于整数的
2.10.3.1. 默认值是45,表示老年代占整个堆的比例
2.10.3.2. 为了让后台线程运行得更频繁
2.11.2.1. 处理区域时Mixed GC周期的最大总次数
2.11.2.2. 混合周期的数量上限
2.11.2.3. 默认值是8
2.11.2.4. 减小该值有助于解决晋升失败的问题(代价是Mixed GC周期的停顿时间更长)
2.11.3.1. GC可接受的最大停顿毫秒数
2.11.3.2. 增加MaxGCPauseMillis标志的值,可以在每次Mixed GC期间回收更多的老年代区域
登录查看全部
参与评论
手机查看
返回顶部