1.回顾CMS
1.1堆内存结构
新生代分为Eden区和两个survivor区。老年代是一块连续区域。
只有FullGC时才可能发生内存整理。
1.2新生代GC
新生代淡绿色,老年代蓝色。系统运行一段时间后CMS堆内存可能如下图所示,对象分散在老年代各处。
新生代存活对象从Eden区和survivor区复制到另一个空闲的survivor区。任何minorGC年龄达到阈值的老对象被升级至老年代。
youngGC(minorGC)后,Eden区和一个survivor区被清空。
新近升级至老年代的对象以深蓝色表示。绿色对象是新生代仍存活的对象。
1.3老年代GC
在初始标记和重新标记阶段发生STW。当老年代剩余空间达到阈值时(发生Concurrent Mode Failure),使用SerialOld替代CMS进行老年代GC。
(1)初始标记停顿时间很短,简单的标记GCRoot引用的对象。(2)并发标记在标记存活对象时,应用继续执行。(3)重新标记阶段,标记并发阶段遗漏的存活对象。
未被标记的对象直接被回收。完成并发清扫后,许多老年代空间被释放出来。同时内存整理仍没有发生,老年代存在大量内存碎片。
最终,CMS经过重置阶段,等待下一次GC。
2.G1收集器
2.1G1实现概览及使用场景
老式垃圾回收器(Serial,Parallel,CMS)统一将java堆分成大小固定的三部分:新生代、老年代和永久代。所有内存对象最终都保存在这三个区域内。
G1收集器将java堆均分成大小相同的区域(region,1M-32M,最多2000个&#x