本文共 2469 字,大约阅读时间需要 8 分钟。
1.4.1 SDK 发布时至少带有六种不同的垃圾收集算法。要了解这些算法之间的差异,您首先需要了解在 1.4.1(以及自 1.2 版本之一以来的先前 JVM)中,JVM 堆分为两个主要区域:年轻代和年老代。首先,离题一下为什么有这两个堆区域。(注意,下面的解释是简化的,避免了诸如堆有更多像Perm空间这样的区域,以及在老年代创建对年轻代来说太大的对象等复杂性。)
许多面向对象程序中的对象生命周期分析表明,大多数对象的生命周期往往非常短,具有中等生命周期的对象较少,而有些对象的生命周期非常长。
使用复制收集器(copying collector)可以有效地实现对短期对象的垃圾收集,而 标记和清除收集器(mark-and-sweep collector)对于全堆更有用,因为该收集器避免了对象泄漏。
在最基本的术语中,复制收集器将所有活动对象从 area1 复制到 area2,然后让 area1 可以自由地重用于新对象或下一个复制集合(copy collection)。标记和清除收集器通过遍历所有对象节点(实例变量和数组元素),将所有能到达(reached )的对象标记为“活着”,从而找到所有可以从 JVM 根到达的对象,然后清扫所有剩余的对象(死对象)。复制收集时间大致与存活对象的数量成正比,标记和清除收集时间大致与堆的大小成正比。
所以堆被分成年轻代和老年代,这样年轻代可以使用复制收集算法(copying collection algorithm),老年代可以使用标记清除收集算法(mark-and-sweep collection algorithm)。对象在年轻代中创建,大多数在该堆空间中生存和死亡,且在不需要强制的完整的标记和清除收集整个堆的情况下就可以有效率被收集。有些对象因为存活时间太长而被移到老年代,如果老年代足够满,必须运行标记和清除收集。
好的,现在您已经掌握了足够的知识来理解我所知道的 6 个 1.4.1 垃圾收集器。年轻代可以使用三个,老年代可以使用三个。标记为“并行(parallel)”的收集器使用多个线程来并行化收集,从而缩短在多 CPU 机器上花费的时间。标记为“并发(concurrent)”的收集器允许应用程序处理在收集执行时并发进行,从而减少或消除垃圾收集导致的应用程序暂停。
a. (原始)复制收集器(The (original) copying collector)(默认启用)。当这个收集器启动时,所有应用程序线程都会停止,并且复制收集使用一个线程进行(这意味着即使在多 CPU 机器上也只有一个 CPU)。这被称为 stop-the-world 收集,因为基本上 JVM 会暂停所有其他操作,直到收集完成。
b. 并行复制收集器(The parallel copying collector)(-XX:+UseParNewGC 启用)。和原始复制收集器一样,这是一个 stop-the-world 收集器。然而,这个收集器在多个线程上并行化了复制收集,这比用于多 CPU 机器的原始单线程复制收集器更有效(尽管不适用于单 CPU 机器)。与原始单线程复制收集器相比,该算法可能会以等于可用 CPU 数量的系数来加速年轻代收集。
c. 并行清除收集器(The parallel scavenge collector)(-XX:UseParallelGC 启用)。这与之前的并行复制收集器类似,但算法针对多 CPU 机器上的千兆字节堆(超过 10GB)进行了调整。此收集算法旨在最大限度地提高吞吐量,同时最大限度地减少停顿。它有一个可选的自适应调整策略,可以自动调整堆空间的大小。如果你使用这个收集器,你只能在老年代使用原来的标记-清除收集器(original mark-sweep collector)(即较新的老年代并发收集器不能和这个年轻代收集器一起工作)。
a. (原始)标记-清除收集器(The (original) mark-sweep collector)(默认启用)。这是使用 stop-the-world 标记-清除收集算法。收集器是单线程的,整个 JVM 暂停,收集器只使用一个 CPU,直到完成。
b. 并发-标记-清除收集器(The concurrent-mark-sweep collector)(-XX:+UseConcMarkSweepGC 启用)。此收集器尝试在收集期间尽可能继续处理应用程序。将集合分为六个阶段,四个阶段是并发的,两个阶段是 stop-the-world :
如果对象的“创建率”过高,并发收集器跟不上并发收集,则回退到传统的标记-清除收集器(concurrent mode failure)。
c. 增量收集器(The incremental collector)(-Xincgc 启用)增量收集器使用“训练”算法一次收集老年代的一小部分。此收集器的开销比标记清除收集器高,但由于每次收集的对象数量很少,因此(stop-the-world)垃圾收集暂停被最小化,代价是总垃圾收集花费的时间更长。“train”算法不保证最大暂停时间,但暂停时间通常小于十毫秒。
转载地址:http://oeamb.baihongyu.com/