G1的收集过程
来源:7-7 Java垃圾回收之总结

湿地车手
2021-12-15
老师,我对G1的收集过程感觉还是有点不清楚,我现在知道的是G1的收集过程分为四步
1.初始标记(STW)
2.并发标记
3.最终标记(STW)
4.清理(STW)
然后又知道G1保留有新生代,老年代的概念,那么到底收集的时候是怎么样的一个过程呢?
我目前的猜测是还是会规定一个Eden,Survivor以及老年代各自的大小,只不过不再是固定的内存区域,而是各自维护一个动态的Region集合。当Eden满了之后触发所谓的“Minor GC”,然后利用上述四步进行新生代收集,然后将超过年龄或者Survivor放不下的对象放入老年代,当老年代满了之后触发所谓的“Full GC/Major GC”,但是还是通过上述四步进行。
然后我的问题是
1.我上面的猜测是不是准确呢?
2.G1实际上只是将Minor GC和Major GC的收集步骤统一起来了是这样么,但是新生代和老年代还是分开收集的?还是说无论是新生代触发了GC还是老年代触发了GC都会统一收集所有内存区域。
3.既然G1可以统一收集方法,那么为什么CMS只能用于老年代呢,新生代为什么不能用CMS的方法进行收集而只能选择ParNew或者Serial搭配CMS进行使用呢?
4.G1相对CMS是不是快就快在不需要整理内存碎片(也就是更少次数的退化成serialOld模式)以及每次不需要清理完所有垃圾?
居然这个问题能被标记为色情也是醉了~
写回答
1回答
-
翔仔
2021-12-16
同学好,抱歉我这几天在外地,手机看得不方便,建议同学可以先看看 https://tech.meituan.com/2016/09/23/g1.html 应该就明白了
00
相似问题