《深入理解Java虚拟机》笔记03 -- 垃圾收集器

收集器可以大致分为:单线程收集器, 并发收集器和并行收集器。

并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。

1. Serial 收集器

    它是单线程收集器。“单线程”是指它在进行垃圾回收时,会暂停其它所有的线程,直至它收集结束。Serial 收集器对于运行在Client 模式下的虚拟机来说是一个很好的选择。

2. ParNew 收集器

    ParNew 收集器是Serial 收集器的多线程版本。它是许多运行在Server模式下的虚拟机中首选的新生代收集器。目前为止,只有它能与CMS收集器配合工作。

它是使用 -XX:+UseConcMarkSweepGC选项后的默认新生代收集器。也可以使用 -XX:+UseParNewGC选项来强制指定它。

3. Parallel Scavenge 收集器

    它是一个新生代收集器,又是并行的多线程收集器。它使用复制算法。它的目标是达到一个可控制的吞吐量。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值。

    有两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的 -XX:MaxGCPauseMills 参数以及直接设置吞吐量大小的 -XX:GCTimeRatio参数。MaxGCPauseMills参数的值设置得稍小一点并不能使得系统的垃圾收集速度变得更快,GC停顿时间缩短是以吞吐量和新生代空间来换取的。新生代大小调小了,会导致垃圾收集频率增加。

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

4. Serial Old收集器

    它是Serial 收集哭的老年代版本。它同样是一个单线程收集器,使用“标记 - 整理”算法。

5. Parallel Old收集器

    它是Parallel Scavenge收集器的老年代版本。使用多线程和“标记 - 整理”算法。

    在注重吞吐量以及CPU资源敏感的场合,都 可以优先考虑Parallel Scavenge 加 Parallel Old 收集器。

6. CMS 收集器

    它是一种以获取最短回收停顿时间为目标的收集器。整个收集过程分为4个步骤:

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

    2)并发标记 -- 进行GC Roots Tracing的过程

    3)重新标记 -- 修正并发标记期间因用户程序继续动作而导致标记产生变动的那一部分对象的标记记录

    4)并发清除。

    其中 1)和 3)这两个步骤仍然需要“Stop the World”。整个过程耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作。

    它默认启动的并发线程数是 ((CPU数量 + 3) /4)。当CPU资源比较紧张时,受到CMS回收器线程的影响,应用系统的性能在垃圾回收阶段可能会非常糟糕。

    CMS不是独占式的回收器,在回收过程中,应用程序仍然在不停地工作,又会不断的产生垃圾。这些新生的垃圾在当前CMS回收过程中是无法清除的。因此,CMS回收器是在当堆内存使用率达到某一阈值时便开始进行回收,以确保垃圾回收时,仍有足够的空间供程序使用。这一阈值使用-XX:CMSInitiatingOccupancyFraction 来指定,默认是68。

    CMS是基于“标记--清除”算法,会产生大量的内存碎片,-XX:+UseCMSCompactAtFullCollection开关可以使CMS在垃圾收集完成后,进行一次内存碎片整理,内存碎片整理不是并发进行的。-XX:CMSFullGCsBeforeCompaction参数可以用于设定进行多少次CMS回收后,进行一次内存压缩。

7. G1 收集器

    G1收集器是一款面向服务端应用的垃圾收集器。在JDK7u4版本开始才有。具备如下特点: 1)并行与并发  2)分代收集  3)空间整合  4)可预测的停顿。

    G1收集器将整个Java堆划分为多个大小相等的独立区域。优先清理回收价值大的区域。大致可划分为以下几个步骤: 1)初始标记  2)并发标记  3)最终标记  4)筛选回收。

    参数 -XX:MaxGCPauseMillis 用于指定目标最大停顿时间。

    参数 -XX:ParallelGCThreads 用于设置并行回收时,GC的工作线程数量。

    参数 -XX:InitiatingHeapOccupancyPercent 指定当整个堆使用率达到多少时,触发标记周期的执行。默认值 45。

下图中有连线的收集器说明这两个收集器可以配合使用。

原文地址:https://www.cnblogs.com/langfanyun/p/7050730.html