今天学习本讲,按照艾宾浩斯遗忘曲线应该复习:37 35 31 24 9。建议大家按照遗忘曲线来复习学过的内容。
这是本人花了6个小时,精心绘制的“垃圾回收”活动图,同时进行了文字总结,大家用心看一定能收获很多
1、前文回顾
Young GC指代年轻代gc,用Old GC指代老年代GC,用Full GC指代年轻代、老年代、永久代共同的gc。
2、Young GC的触发时机
新生代的Eden区域满了之后就会触发,用复制算法来回收 。
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,顺带收了永久代垃圾