Java垃圾回收(GC)机制

383 阅读3分钟

引用

[jvm垃圾回收机制&&老年代空间担保机制 | ProcessOn免费在线作图,在线流程图,在线思维导图 |​

www.processon.com![图标](p3-juejin.byteimg.com/tos-cn-i-k3…)](link.zhihu.com/?target=htt…)

Minor GC Young GC Major GC Full GC范围

  • Minor GC:Eden区
  • Young GC:年轻代=Eden+S0+S1
  • Major GC:年老代
  • Full GC:年轻代+年老代

1、前文回顾

  Young GC指代年轻代gc,用Old GC指代老年代GC,用Full GC指代年轻代、老年代、永久代共同的gc。

2、Young GC的触发时机

  新生代的Eden区域满了之后就会触发(Young GC大于15次即age>15也会触发),用复制算法来回收 。

3、Old GC和Full GC的触发时机

看图说话(为了显示效果,把图分成了两幅):

绿色线表示正常进行垃圾回收;

粉色表示需要进行判断是否需要OldGC

红色线表示确定要进行OldGC;

棕色线表示需要进行判断,是YoungGC还是OldGC

3.1、先看图中蓝框圆圈

  蓝框圆圈表示一个新起点,中间的数字表示第几步。

蓝框2圆圈:准备进行垃圾回收。走到这步说明必须要进行垃圾回收了,但怎么回收还不确定

蓝框3-X圆圈:马上进行Old GC

蓝框3-Y圆圈:马上进行Young GC

蓝框5圆圈:马上进行Old GC,之前已经进行过了Young GC

图1:

图2:

3.2、再从指向蓝框圆圈的箭头,向上分析各个箭头的路径来源

  我们主要分析产生GC的条件,那么指向就分析指向YoungGC和OldGC的箭头路径,即指向(3-X)、(3-Y)、(5)的箭头路径

分析产生YoungGC的条件,就是分析指向(3-X)的实线箭头,实线箭头有2条,即产生YoungGC的条件有2个:

  新生代空间不足时

    1、不需要空间担保,直接Young GC

    2、空间担保成功

分析产生OldGC的条件,就是分析指向(3-Y)、(4)的实现箭头,实线箭头有3条,即产生OldGC的条件有3个:

  新生代空间不足时

    1、未设置空间担保

    2、空间担保失败

    3、Young GC后,晋升到老年代,老年代剩余空间不足

    (注意:老年代剩余在CMS默认值是:老年代总空间 * 92%, 参数设置:-XX:CMSInitiatingOccupancyFaction)

  总结:

  细心的朋友已经发现,产生YoungGC和Old GC的前置条件都有“新生代空间不足时”,所以当“新生代空间不足时”Young GC一定会发生,只是发生的时机不同,从图中可以看到有三种情况:  

1、仅 Young GC 。

  查看 (3-Y)到(4)路径

2、Young GC + Old GC

  查看 (3-Y)到(5)路径

3、Old GC + Young GC

  查看 (3-X)到(4)路径和 看(3-X)到(OOM)路径

  所以这就是为什么每次Old GC都会伴随着一次Young GC。Old GC从来不会单独出现

4、永久代满了之后怎么办?

  永久代满了会触发一次Full GC,顺带收了永久代垃圾

摘至(增加并补充相关内容):

[038、JVM实战总结:200小时积累,6小时烹制,史上最强图,图解:大厂面试题,Young GC和Full GC分别在什么情况下会发生?​

blog.csdn.net图标](link.zhihu.com/?target=htt…)