jvm 优化篇-(7)-G1回收过程(-XX:MaxGCPauseMillis、‐XX:G1MixedGCCountTarget、‐XX:G1HeapWastePercent、‐XX:G1Mix...

死神

1、G1垃圾回收♻️过程

1.1、触发混合回收♻️条件:

         -XX:InitiatingHeapOccupancyPercent=45 ,当老年代空间使用占整个堆空间45%时。

1.2、混合回收♻️范围:

        新生代、老年代、大对象。

1.3、混合回收过程:
  • 初始标记
    • 1、这个过程会STW,停止系统线程。
    • 2、标记GC-Roots的直接引用对象。
      • 1、线程栈中局部变量表 。
      • 2、方法区中的静态变量。
      • 3、本地方法栈。
    • 3、特点:速度极快。
  • 并发标记
    • 1、这个过程不会STW,系统线程正常运行。
    • 2、从第一阶段标记的GC-Roots开始追踪所有存活对象。
    • 3、特点:慢,很耗时。
    • 4、优化:JVM会对“并发标记”阶段新产生的对象及对象修改做记录(RememberSet)
  • 最终标记
    • 1、这个过程会STW,系统线程停止运行。
    • 2、会根据“并发标记”阶段记录的RememberSet进行对象标记。
    • 3、特点:很快。
    • 4、RememberSet相当于是拿空间换时间。
  • 混合回收♻️
    • 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、在Mixed回收♻️的时候,无论是年轻代还是老年代都是基于复制算法进行回收♻️,都要把各个Region的存活对象拷贝到另外其他的Region里去,万一拷贝是发生空间不足,就会触发一次失败。一旦回收失败,立马就会切换采用Serial 单线程进行标记+清理+整理,整个过程是非常慢的(灾难)

你可能感兴趣的:(jvm 优化篇-(7)-G1回收过程(-XX:MaxGCPauseMillis、‐XX:G1MixedGCCountTarget、‐XX:G1HeapWastePercent、‐XX:G1Mix...)