JVM面试_8



老年代常见的垃圾收集器 Serial Old收集器
  1. 通过命令UseSerialOldGC可以使老年代使用该收集器回收垃圾,它使用的是标记-整理算法.
  2. 单线程收集,进行垃圾收集时,必须暂停所有的工作线程.
  3. 简单高效,Client模式下默认的老年代收集器
    在这里插入图片描述

Parallel Old收集器
1. 通过命令UseParallelOldGC可以使老年代使用该收集器回收垃圾,它使用的是标记-整理算法.
2. 多线程收集,吞吐量优先.
在这里插入图片描述

CMS收集器
1. 通过命令UseConcMarkSweepGC可以使老年代使用该收集器回收垃圾,它使用的是标记-清除算法.
2. 它的意义在于垃圾回收线程和用户线程几乎可以做到同时工作.
3. 其垃圾回收过程主要分为以下六步:
1. 初始化标记: 此时会发生stop-the-world,这个阶段需要虚拟机停顿正在执行的任务.
2. 并发标记: 并发追溯标记,程序不会停顿(与应用程序线程并发执行).
3. 并发预处理: 查找执行并发标记阶段从年轻代晋升到老年代的对象.
4. 重新标记: 暂停虚拟机,扫描CMS堆中的剩余对象.
5. 并发清理: 清理垃圾对象,程序不会卡顿.
6. 并发重置: 重置CMS收集器的数据结构.
在这里插入图片描述



G1收集器(Garbage First收集器)
1. 通过命令UseG1GC可以使老年代使用该收集器回收垃圾,它使用的是复制+标记-整理算法.
2. Garbage First收集器既用于年轻代,也用于老年代.
3. 它会将整个java堆内存划分为多个大小相等的Regin(区域).
4. 新生代和老年代不再物理隔离,他们可以是一部分不连续的Regin的集合.
在这里插入图片描述
Garbage First收集器的特点
  1. 并发和并行: 使用多个cpu来缩短stop-the-world的停顿时间,与用户线程并发执行.
  2. 分代收集
  3. 空间整合
  4. 可预测的停顿.