Java虚拟机 JVM的GC总结之垃圾回收器

一.Hotspot虚拟机所包含的收集器类型

Java虚拟机 JVM的GC总结之垃圾回收器_第1张图片

  • 新生代:

    • Serial收集器
    • ParNew收集器
    • Parallel Scavenge收集器
  • 老年代:

    • CMS收集器
    • Serial Old 收集器
    • Parallel Old收集器
  • 整堆收集器:

    • G1收集器

Java 虚拟机的垃圾收集器可以分为四大类别:串行收集器、并行收集器、CMS 收集器、G1收集器。

GC中并行与并发的概念

  • 并行(parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
  • 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替进行),用户程序在继续镜像,而垃圾收集程序运行于另一个CPU上。

二.Serial串行收集器

串行收集器是指使用单线程进行垃圾回收的收集器。因为每次回收时只有一个线程,因此串行收集器在并发能力较弱的计算机上,其专注性和独占性的特点往往能让其有更好的性能表现。当虚拟机在 Client 模式下运行时,其默认使用该垃圾收集器。

串行收集器分为Serial和Serial Old两种:

  • 新生代串行收集器中使用的是复制算法。在串行收集器进行垃圾回收时,会触发 Stop-The-World 现象
  • 老年代串行收集器采用标记整理算法。同样是单线程,会触发stop-the-world。
    Java虚拟机 JVM的GC总结之垃圾回收器_第2张图片

三.并行收集器

  • 并行收集器在串行收集器的基础上做了改进,其使用多线程进行垃圾回收。对于并行能力强的机器,可以有效缩短垃圾回收所使用的时间。
  • 并行收集器分为三种:
    • ParNew收集器
    • Parallel GC 收集器
    • ParallelOldGC 收集器

1.ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本(只在年轻代是多线程)。除了将单线程改为并行执行外,其他没有什么不同

  • ParNew 同样使用复制的垃圾回收算法
  • ParNew 收集器同样存在stop-the-world问题,但因为其使用多线程进行垃圾回收,因此在并发能力强的 CPU 上,其产生的停顿时间要短于串行回收器。
  • ParNew收集器是许多运行在Server模式下的虚拟机中首选的新生代收集器,因为它是除了Serial收集器外,唯一一个能与CMS收集器配合工作的。
    Java虚拟机 JVM的GC总结之垃圾回收器_第3张图片

2.Parallel GC 收集器

  • 与新生代 ParNew 回收器非常类似,其也是使用复制算法,都是多线程、独占式的收集器
  • 其非常注重系统的吞吐量,也称为吞吐量优先收集器
  • 吞吐量的概念:CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 ))。例如:虚拟机共运行100分钟,垃圾收集器花掉1分钟,那么吞吐量就是99%
  • 采用GC自适应调节策略

GC自适应调节策略:Parallel Scavenge收集器可设置-XX:+UseAdptiveSizePolicy参数。当开关打开时不需要手动指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio=n)、晋升老年代的对象年龄(-XX:PretenureSizeThreshold)等,虚拟机会根据系统的运行状况收集性能监控信息,动态设置这些参数以提供最优的停顿时间和最高的吞吐量,这种调节方式称为GC的自适应调节策略。

3.Parallel Old 收集器

  • 与新生代 ParallelGC 收集器一样,其也是注重吞吐量的收集器,只不过其是作用于老年代。
  • 采用标记整理算法

Java虚拟机 JVM的GC总结之垃圾回收器_第4张图片


四.CMS收集器

CMS 收集器全称为 Concurrent Mark Sweep,意为标记清除算法,其是一个使用多线程并行回收的垃圾收集器。获取最短回收停顿时间为目标

  • 基于标记-清除算法实现。并发收集、低停顿。
  • 适用于注重服务的响应速度,希望系统停顿时间最短的使用环境
  • 主要工作步骤有:初始标记、并发标记、预清理、重新标记、并发清除和并发充值。其中初始标记和重新标记是独占系统资源的,而其他阶段则可以和用户线程一起执行。
  • CMS收集器的内存回收过程是与用户线程一起并发执行的。

Java虚拟机 JVM的GC总结之垃圾回收器_第5张图片

五.G1收集器

G1 收集器是 JDK 1.7 中使用的全新垃圾收集器

  • 并行并发 :G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短Stop-The-World停顿时间。部分收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让Java程序继续运行。
  • 分代收集:G1能够独自管理整个Java堆,使用了分区算法,从而使得 Eden 区、From 区、Survivor 区和老年代等各块内存不必连续
  • 空间整合 :G1运作期间不会产生空间碎片,收集后能提供规整的可用内存。
    Java虚拟机 JVM的GC总结之垃圾回收器_第6张图片

G1收集器分为四个工作步骤:

  • 新生代 GC
  • 并发标记周期:在这个阶段,所有将要被回收的区域会被 G1 记录在一个称之为 Collection Set 的集合中。
  • 混合收集:混合回收阶段会首先针对 Collection Set 中的内存进行回收,因为这些垃圾比例较高
  • Full GC:当在回收阶段遇到内存不足时,G1 会停止垃圾回收并进行一次 Full GC,从而腾出更多空间进行垃圾回收

你可能感兴趣的:(JVM)