3

Java虚拟机-经典垃圾回收器

 3 years ago
source link: https://www.haicheng.website/passages/jvm-ClassicGarbageCollector/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Bj2eMn3.bmp!mobile

上图列举了七种作用于不同分代的垃圾收集器,如果两个收集器存在连线就说明可以搭配使用。收集器所处的区域表示它所属的年轻代还是老年代

属于年轻代的回收器

Serial收集器

简单高效且内存消耗小,适用于客户端模式下的虚拟机

该收集器是一个单线程工作的。意思是当它在进行垃圾回收时,必须暂停其他所有工作线程,直至它收集结束。Serial和Serial Old收集器的运行过程如图所示:

v2URv2m.png!mobile

ParNew收集器

Serial收集器的的多线程版本,除了同时使用多个线程进行垃圾回收之外其余行为与Serial收集器一致。在JDK1.7之前是除了Serial收集器之外,只有它能与CMS收集器配合工作

E7vquy7.png!mobile

Parallel Scavenge收集器

以吞吐量为指标的收集器,与ParNew收集器一样支持并行收集。使用两个参数用于精确控制吞吐量,也支持自适应调节策略

-XX:MAXGCPauseMillis
-XX:GCTimeRatio

属于老年代的收集器

Serial Old收集器

Serial收集器的老年代版本,是一个单线程收集器, 使用标记-压缩算法。在服务器端模式下,存在两种用途:

  • 在JDK5以及之前的版本中与Parallel Scavenge收集器搭配使用
  • 作为CMS收集器发生失败之后的后备方案
v2URv2m.png!mobile

Parellel Old收集器

Parellel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-压缩算法实现。

QBNFBvU.png!mobile

CMS收集器(Concurrent Mark Sweep)

是一种以获取最短回收停顿时间为目标的收集器,基于标记-清除算法实现。整个过程分为四个步骤:

  1. 初始标记: 标记GC Roots能直接关联到的对象
  2. 并发标记:从GC Roots的直接关联对象开始遍历整个对象图
  3. 重新标记:修改并发标记期间因用户线程继续运作而导致标记产生变动的那部分对象
  4. 并发清除:清理删除标记阶段判定已经死亡的对象

缺点:

  1. 由于使用标记-清除算法,在完成收集之后会产生碎片。碎片过多将会给大对象分配带来很大的麻烦,由于存在很多剩余的空间但是无法找到足够大的连续空间来分配对象,而不得不提前触发Full GC

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK