java老年代垃圾回收器
Serial Old收集器(-XX:+UseSerialOldGC , 标记-整理算法)
- 单线程收集,进行垃圾收集时,必须暂停所有的工作线程
- 简单高效,Client模式下默认的老年代收集器
Parallel Old收集器(-XX:+UseParallelOldGC , 标记-整理算法 JDK6之后)
- 多线程,吞吐量优先
CMS收集器(-XX:+UseConcMarkSweepGC , 标记-清除算法)
老年代收集器的半壁*,几乎能与用户线程同时工作
- 初始标记:stop-the-world
- 并发标记:并发追溯标记,程序不会停顿(与用户线程同时并行)
- 并发预清理:查找执行并发标记阶段从新生代晋升到老年代的对象
- 重新标记:暂停虚拟机,扫描CMS堆中的剩余对象(这一步也需要stop-the-world)
- 并发清理:清理垃圾对象,程序不会停顿
- 并发重置:重置CMS收集器的数据结构
G1收集器(-XX:+UseG1GC , 复制+标记-整理算法)
Garbage First收集器的特点(老年代和新生代都能用)
- 并行和并发;
- 分代收集;
- 空间整合;
- 可预测的停顿;
Garbage First收集器
- 将整个Java堆内存划分成多个大小相等的Region
- 新生代和老年代不在物理隔离
解析:Eden region和Survivor region组成新生代;当Eden满了之后,会执行新生代GC回收,把数据从Eden 复制到 Survivor中