jvm 优化篇-(7)-G1回收过程(-XX:MaxGCPaus
2020-05-10 本文已影响0人
tianlang136520
死神
1、G1垃圾回收♻️过程
1.1、触发混合回收♻️条件:
-XX:InitiatingHeapOccupancyPercent=45 ,当老年代空间使用占整个堆空间45%时。
1.2、混合回收♻️范围:
新生代、老年代、大对象。
1.3、混合回收过程:
-
初始标记:
- 1、这个过程
会STW
,停止系统线程。 - 2、标记GC-Roots的直接引用对象。
- 1、线程栈中局部变量表 。
- 2、方法区中的静态变量。
- 3、本地方法栈。
- 3、特点:速度极快。
- 1、这个过程
-
并发标记:
- 1、这个过程
不会STW
,系统线程正常运行。 - 2、从第一阶段标记的GC-Roots开始追踪所有存活对象。
- 3、特点:慢,很耗时。
- 4、优化:JVM会对“并发标记”阶段新产生的对象及对象修改做记录(RememberSet)
- 1、这个过程
-
最终标记:
- 1、这个过程
会STW
,系统线程停止运行。 - 2、会根据“并发标记”阶段记录的RememberSet进行对象标记。
- 3、特点:很快。
- 4、RememberSet相当于是拿空间换时间。
- 1、这个过程
-
混合回收♻️:
- 1、这个过程
会STW
,系统线程停止运行。 - 2、会计算老年代中每个Region中存活对象数量,存活对象占比,执行垃圾回收预期耗时和效率。
- 3、耗时:会根据启动参数中
-XX:MaxGCPauseMillis=200
和历史回收耗时来计算本次要回收♻️多少老年代Region才能耗时200ms。 - 4、特点:回收了一部分远远没有达到回收♻️的效果,G1还有一个特殊处理方法,STW后进行回收,然后恢复系统线程,然后再次STW,执行混合回收掉一部分Region,
‐XX:G1MixedGCCountTarget=8 (默认是8次)
,反复执行上述过程8次。eg:假设要回收400个Region,如果受限200ms,每次只能回收♻️50个Region,反复8次刚好全部回收完毕。------>这么做的好处是避免单次停顿回收♻️STW时间太长。 - 5、还有一个参数要提一下
‐XX:G1HeapWastePercent=5 (默认是5%)
。混合回收♻️是采用复制算法,把要回收的Region中存活的对象放入其他Region中,然后这个Region中的垃圾全部清理掉,这样就会不断有Region释放出来,当释放出的Region占整个堆空间5%时,停止混合回收♻️。 - 6、还有一个参数:
‐XX:G1MixedGCLiveThresholdPercent=85 (默认值85%)
。回收Region的时候,必须是存活对象低于85%。
- 1、这个过程
-
混合回收♻️失败时:
- 1、在Mixed回收♻️的时候,无论是年轻代还是老年代都是基于复制算法进行回收♻️,都要把各个Region的存活对象拷贝到另外其他的Region里去,万一拷贝是发生空间不足,就会触发一次失败。一旦回收失败,立马就会切换采用Serial 单线程进行标记+清理+整理,
整个过程是非常慢的(灾难)
。
- 1、在Mixed回收♻️的时候,无论是年轻代还是老年代都是基于复制算法进行回收♻️,都要把各个Region的存活对象拷贝到另外其他的Region里去,万一拷贝是发生空间不足,就会触发一次失败。一旦回收失败,立马就会切换采用Serial 单线程进行标记+清理+整理,