老年代常见的垃圾收集器
Serial Old收集器
- 通过命令
UseSerialOldGC
可以使老年代使用该收集器回收垃圾,它使用的是标记-整理算法
. - 单线程收集,进行垃圾收集时,必须暂停所有的工作线程.
- 简单高效,Client模式下默认的老年代收集器
Parallel Old收集器
- 通过命令
UseParallelOldGC
可以使老年代使用该收集器回收垃圾,它使用的是标记-整理算法
. - 多线程收集,吞吐量优先.
CMS收集器
- 通过命令
UseConcMarkSweepGC
可以使老年代使用该收集器回收垃圾,它使用的是标记-清除算法
. - 它的意义在于垃圾回收线程和用户线程几乎可以做到同时工作.
- 其垃圾回收过程主要分为以下六步:
- 初始化标记: 此时会发生stop-the-world,这个阶段需要虚拟机停顿正在执行的任务.
- 并发标记: 并发追溯标记,程序不会停顿(与应用程序线程并发执行).
- 并发预处理: 查找执行并发标记阶段从年轻代晋升到老年代的对象.
- 重新标记: 暂停虚拟机,扫描CMS堆中的剩余对象.
- 并发清理: 清理垃圾对象,程序不会卡顿.
- 并发重置: 重置CMS收集器的数据结构.
G1收集器(Garbage First收集器)
-
通过命令
UseG1GC
可以使老年代使用该收集器回收垃圾,它使用的是复制+标记-整理算法
. -
Garbage First收集器既用于年轻代,也用于老年代.
-
它会将整个java堆内存划分为多个大小相等的Regin(区域).
-
新生代和老年代不再物理隔离,他们可以是一部分不连续的Regin的集合.
Garbage First收集器的特点 -
并发和并行: 使用多个cpu来缩短stop-the-world的停顿时间,与用户线程并发执行.
-
分代收集
-
空间整合
-
可预测的停顿.