剑指Offer(GC)——老年代垃圾收集器

垃圾收集器之间的联系,本文主要讲解一下老年代收集器。
在这里插入图片描述

Serial Old收集器(-XX:+UseSerialOldGC,标记-整理算法)

是Serial GC老年代版本,也是单线程的进行垃圾收集的时候必须暂停所有的工作线程,同样是简单高效,是Client模式下老年代的默认垃圾收集器。
在这里插入图片描述

Parallel Old收集器(-XX:+UseParallelOldGC,标记-整理算法)

是在JDK6之后出现的垃圾收集器,此之前只有Serial Old收集器,相对Serial Old收集器是多线程的并且以吞吐量为优先原则。
在这里插入图片描述

CMS收集器(-XX:+UseConcMarkSweepGC,标记-清除算法)

此垃圾收集器几乎能和用户线程同时工作。

标记-清除分为如下步骤:

  • 初始标记:stop-the-world
  • 并发标记:并发追溯标记,程序不会停顿;
  • 并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象;
  • 重新标记:暂停虚拟机,扫描CMS堆中的剩余对象
  • 并发清理:清理垃圾对象,程序不会停顿;
  • 并发重置:重置CMS收集器的数据结构。
    在这里插入图片描述
    开始标记时候根据快照时候垃圾进行一遍清除,同时会产生新的垃圾,进行下一次和用户线程的并发刷新,缺点是采用标记-清除算法,会产生内存碎片,存在OOM风险。

G1收集器(-XX:+UseG1GC,复制+标记-整理算法)

此垃圾收集器适用于新生代和老年代,和其他老年代垃圾收集器相比有如下的特点:

  • 并发和并行:使用多个CPU来减少stop-the-world停止时间,多线程是并发执行的;
  • 分代收集:使用不同方式去处理,新创建出来的对象产生垃圾和已存在一段时间的对象产生的垃圾;
  • 空间整合:通过标记整理解决内存碎片的问题;
  • 可预测的停顿:使用户指定在GC上消耗的时间,不超过设定的时间。

使用此垃圾收集器之后整个Java堆内存被划分成多个大小相等的Region,新生代和老年代不是物理隔离的。
在这里插入图片描述
不需要一个连续的内存空间决定哪个是新生代哪个是老年代。

发布了219 篇原创文章 · 获赞 21 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44240370/article/details/104074883