GC之7大垃圾收集器详解(上)

GC之7大垃圾收集器详解


目录

  1. GC之7大垃圾收集器概述
  2. GC之Serial收集器
  3. GC之ParNew收集器
  4. GC之Parallel收集器
  5. GC之ParallelOld收集器
  6. GC之CMS收集器
  7. GC之SerialOld收集器
  8. GC之如何选择垃圾收集器
  9. GC之G1收集器

1. GC之7大垃圾收集器概述

  1. 垃圾收集器具体实现GC算法并实现内存回收。不同厂商,不同版本的虚拟机实现差别很大,HotSpot中包含的收集器如下图所示:
    GC之7大垃圾收集器详解(上)_第1张图片

  2. 部分参数说明,下面会见到。
    GC之7大垃圾收集器详解(上)_第2张图片

  3. 小扩展:Server/Client模式分别是什么意思
    GC之7大垃圾收集器详解(上)_第3张图片


2. GC之Serial收集器


  1. 串行收集器:Serial收集器,一个单线程收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束
    GC之7大垃圾收集器详解(上)_第4张图片

  2. 串行收集器是最古老,最稳定以及效率高的收集器,只使用一个线程去回收但其在进行垃圾收集过程中可能会产生较长的停顿(Stop-The-world状态)。虽然在收集垃圾过程中需要暂停所有其他的工作线程,但是它简单高效,对于限定单个CPU环境来说,没有线程交互的开销可以获得最高的单线程垃圾收集效率,因此Serial垃圾收集器依然是Java虚拟机运行在Client模式下默认的新生代垃圾收集器。

  3. 对应JVM参数是:-XX:+UseSerialGC
    开启后会使用:Serial(young区用)+SerialOld(Old区用)的收集器组合(参考图一)
    表示:新生代、老年代都会使用串行回收收集器,新生代使用复制算法,老年代使用标记-整理算法


3. GC之ParNew收集器


  1. ParNew(并行)收集器:使用多线程进行垃圾回收,在垃圾收集时,会Stop-the-World暂停其他所有的工作线程直到它收集结束。
    GC之7大垃圾收集器详解(上)_第5张图片

  2. ParNew收集器其实就是Seria收集器新生代的并行多线程版本,最常见的应用场景是配合老年代的CMS GC工作,其余的行为和Serial收集器完全一样,ParNew垃圾收集器在垃圾收集过程中同样也要暂停所有其他的工作线程。它是很多Java虚拟机运行在Server模式下新生代的默认垃圾收集器。

  3. 常用对应JVM参数:-XX:+UseParNewGC,启用ParNew收集器,只影响新生代的收集,不影响老年代

  4. 开启上述参数后,会使用:ParNew(Young区用)+SerialOld的收集器组合,新生代使用复制算法,老年代采用标记-整理算法

  5. 但是,ParNew+Tenured这样的搭配,java8已经不再推荐:
    在这里插入图片描述

  6. -XX:ParallelGCThreads 限制线程数量,默认开启和CPU数目相同的线程数。


4. GC之Parallel收集器


  1. Parallel Scavenge收集器类似ParNew也是一个新生代垃圾收集器,使用复制算法,也是一个并行的多线程的垃圾收集器,俗称吞吐量优先收集器。一句话:串行收集器在新生代和老年代的并行化
    GC之7大垃圾收集器详解(上)_第6张图片

  2. 它重点关注的是:可控制的吞吐量〈Thoughput=运行用户代码时间/(运行用户代码时间+垃圾收集时间),也即比如程序运行100分钟,垃圾收集时间1分钟,吞吐量就是99%)。高吞吐量意味着高效利用CPU的时间,它多用于在后台运算而不需要太多交互的任务。

  3. 自适应调节策略也是ParallelScavenge收集器与ParNew收集器的一个重要区别。(自适应调节策略:虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间(-XX:MaxGCPauseMillis)或最大的吞吐量。

  4. 常用JVM参数:-XX:+UseParaIIeIGC或-XX:+UseParaIIeIOldGC(可互相激活)使用ParallelScanvenge收集器开启该参数后:新生代使用复制算法,老年代使用标记·整理算法

  5. 补充:
    -XX:ParaIIeIGCThreads=数字N,表示启动多少个GC线程
    cpu>8,N=5/8
    cpu<8,N=实际个数


5. GC之ParallelOld收集器

  1. ParallelOld收集器是ParaScavenge的老年代版本,使用多线程的标记-整理算法,Parallel Old收集器在JDKI.6才开始提供。

  2. 在JDK1.6之前,新生代使用ParallelScavenge收集器只能搭配年老代的SerialOld收集器,只能保证新生代的吞吐量优先,无法保证整体的吞吐量。

  3. ParallelOld正是为了在年老代同样提供吞吐量优先的垃圾收集器,如果系统对吞吐量要求比较高,JDK1.8后可以优先考虑新生代ParallelScavenge和年老代Parallel Old收集器的搭配策略。在JDK1.8及后(Parallel Scavenge+Parallel Old)

  4. JVM常用参数:
    -XX:+UseParallelOldGC使用ParallelOld收集器,设置该参数后,新生代Parallel+老年代ParallelOld

6. GC之CMS收集器

GC之CMS收集器和目录下的内容,篇幅限制,放在另一篇博客具体讲:GC之7大垃圾收集器详解(下)

你可能感兴趣的:(JVM)