JVM学习笔记(九、GC3-垃圾回收器)

目录:

  • Serial
  • ParNew
  • Parallel Scavenge
  • Serial Old
  • Parallel Old
  • Concurrent Mark Sweep
  • G1

GC收集器配合使用图:

Serial:

单线程的收集器,它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,最重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。

开启参数:-XX:+UseSerialGC。

适用场景:用户的桌面应用场景。

ParNew:

Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、 收集算法、 Stop The World、 对象分配规则、 回收策略等都与Serial收集器完全一样。

开启参数:-XX:+UseParNewGC。

适用场景:Server首选的新生代收集器。

Parallel Scavenge:

Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,它的目标是达到一个可控制的吞吐量(Throughput)

吞吐量计算公式运行用户代码时间/(运行用户代码时间+垃圾收集时间)

垃圾收集停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。

Parallel Scavenge提供了两个参数用于精确控制吞吐量:

1 -XX:MaxGCPauseMillis       // 最大垃圾收集停顿时间(大于0毫秒数)
2 -XX:GCTimeRatio            // 吞吐量大小(大于0且小于100的整数,吞吐量百分比)

当然你也可以通过AdaptiveSizePolicy来让JVM管理:

  • -XX:+UseAdaptiveSizePolicy:内存调优委托给虚拟机管理。当这个参数打开之后,就不需要手工指定新生代的大小、Eden与Survivor区的比例、 晋升老年代对象年龄等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。

开启参数:-XX:+UseParallelGC。

适用场景:后台计算不需要太多交互。

Serial Old:

Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。 这个收集器的主要意义也是在于给Client模式下的虚拟机使用。

适用场景:用户的桌面应用场景。

Parallel Old:

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器从JDK 1.6中才开始提供的。

开启参数:-XX:+UseParallelOldGC。

适用场景:用户的桌面应用场景。

Concurrent Mark Sweep:

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器是基于“标记—清除”算法实现的。整个过程分为4个步骤:

  • 初始标记(CMS initial mark)。
  • 并发标记(CMS concurrent mark)。
  • 重新标记(CMS remark)。
  • 并发清除(CMS concurrent sweep)。

初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,速度很快

并发标记:该阶段就是进行GC RootsTracing的过程

重新标记:该阶段是为了修正并发标记期间因用户程序继续运作而导致标记发生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但比并发标记的时间短。

并发清理:清理垃圾对象,这个阶段收集器线程和应用程序线程并发执行。

缺点:

  • CMS收集器对CPU资源非常敏感。
  • CMS收集器无法处理浮动垃圾(Floating Garbage),可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。
  • CMS是一款基于“标记—清除”算法实现的收集器**,这意味着收集结束时会有大量空间碎片产生。

开启参数:-XX:+UseConcMarkSweepGC。

适用场景:互联网站或者WEB服务端。

G1:

G1算法将堆划分为若干个区域(Region),但它仍然属于分代收集器。

不过,这些区域的一部分包含新生代,新生代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者Survivor空间。

老年代也分成很多区域,G1收集器通过将对象从一个区域复制到另外一个区域,完成了清理工作。这就意味着,在正常的处理过程中,G1完成了堆的压缩(至少是部分堆的压缩),这样也就不会有CMS内存碎片问题的存在了。

G1提供了两种GC模式(两种都是Stop The World的):Young GC、Mixed GC。

YoungGC:

阶段1:根扫描。静态和本地对象被扫描。

阶段2:更新RS(Remembered Set)。找出老年代到年轻代的引用并更新RS。

阶段3:处理RS。检测从年2轻代指向年老代的对象。

阶段4:对象拷贝。拷贝存活的对象到survivor/old区域。

阶段5:处理引用队列。软引用,弱引用,虚引用处理。

Min GC:

初始标记:该阶段仅仅只是标记一下GC Roots能直接关联到的对象。

并发标记:该阶段是从GCRoot开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行。

最终标记:该阶段则是为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录。

筛选回收:该阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划。因为只回收一部分Region,所以时间是用户可控制的,而且停顿用户线程将大幅提高收集效率。

开启参数:-XX:+UseG1GC。

适用场景:服务端应用。

原文地址:https://www.cnblogs.com/bzfsdr/p/13699397.html