> 文章列表 > JVM系列(七) JVM 垃圾收集器

JVM系列(七) JVM 垃圾收集器

JVM系列(七) JVM 垃圾收集器

我们知道JVM会回收垃圾,但是每种垃圾收集器的收集机制和收集的方法都不一样,今天我们讨论下几种垃圾回收机制

1.按照垃圾区域划分垃圾收集器

我们可以按照垃圾存在的区域来划分垃圾收集器,垃圾在堆内的区域分为

  • 新生代垃圾
  • 老年代垃圾
  • 新生代老年代混合垃圾

按照这三种区域类型,我们可以将垃圾收集器分为以下几种

  • 新生代的收集器包括

    1. Serial 单线程顺序垃圾收集器,收集年轻代垃圾
    2. PraNew Serial单线程垃圾收集器的多线程版本,收集年轻代垃圾
    3. Parallel-Scavenge 采用复制算法的并行多线程收集器,收集年轻代垃圾
  • 老年代的收集器包括

    1. Serial Old Serial收集器的老年代垃圾回收版本
    2. Parallel Old Parallel-Scavenge收集器的老年代版本
    3. CMS Concurrent Mark Sweep 名字上就可以看出,CMS采用的标记-清除算法,它是一种以获取最短停顿时间为目标的收集器
  • 通用垃圾收集器

    1. G1收集器 回收整个Java堆(新生代和老年代)

2.查看默认垃圾收集器

java -XX:+PrintCommandLineFlags -version

通过该命令可以查看 jdk默认的垃圾收集机制,可以看到

  • Java HotSpot™ 64-Bit Server 服务端
  • 默认的垃圾收集器是 并行垃圾收集器 -XX:+UseParallelGC
-XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

JVM系列(七) JVM 垃圾收集器

3.设置JVM垃圾收集器

既然有这么多的垃圾收集器,我们在具体的使用的时候,到底怎么设置垃圾收集器?
或者 我们如何看出来这个垃圾收集器生效了

我们可以通过设置JVM参数来设置 垃圾收集器的方式

3.1 Serial串行垃圾收集器

JVM配置参数设置使用串行垃圾收集器

  • 年轻代 Serial
  • 老年代 Serial Old
-XX:+UserSerialGC

收集区域: Serial (新生代),Serial Old(老年代)。

使用算法: Serial (标记复制法),Serial Old(标记整理法)。

搜集方式: 单线程收集。

优势: 内存资源占用少、单核CPU环境最佳选项。

劣势: 整个搜集过程需要停顿用户线程。多核CPU、内存富足的环境,资源优势无法利用起来。

3.2 ParallelGC 并行垃圾收集器

JVM配置参数设置 -XX:+UseParallelGC启用Parallel回收器

  • 年轻代 Parallel-Scavenge
  • 老年代 Parallel Old
-XX:+UseParallelGC

收集区域: Parallel Scavenge (新生代),Parallel Old(老年代)。

使用算法: Parallel Scavenge (标记复制法),Parallel Old(标记整理法)。

搜集方式: 多线程。

优势: 多线程收集,CPU多核环境下效率要比serial高。

劣势: 整个搜集过程需要停顿用户线程。

3.3 CMS标记清除垃圾收集器

JVM配置参数设置 -XX:+UseConcMarkSweepGC启用CMS垃圾收集器

  • 年轻代 ParNew 这是让CMS出彩的地方,年轻到收集采用 ParNew
  • 老年代 CMS Old
-XX:+UseConcMarkSweepGC 

CMS参数配置手动指定使用CMS收集器执行内存回收任务。
开启该参数后会自动将-XX:+UseParNewGC打开
即: ParNew(Young区用)+CMS(Old区用)+Serial Old的组合

收集区域: 老年代。

使用算法: 标记清除法+标记整理法。

搜集方式: 多线程。

搭配收集器: ParNew。

优势: 多线程收集,收集过程不停止用户线程,所以用户请求停顿时间短。

3.4 G1通用垃圾收集器

JVM配置参数设置 -XX:+UserSerialGC启用G1垃圾收集器

-XX:+UserSerialGC

收集区域: 整个堆内存。

使用算法: 标记复制法

搜集方式: 多线程。

搭配收集器: 无需其他收集器搭配。

优势: 停顿时间可控,吞吐量高,可根据具体场景选择吞吐量有限还是停顿时间有限,不需要额外的收集器搭配。

劣势: 因为需要维护的额外信息比较多,所以需要的内存空间也要大,6G以上的内存才能考虑使用G1收集器。


至此 我们讲解了各种垃圾收集器的配置及收集垃圾的优劣势,在实际的工作中要根据具体的场景去设置不同的垃圾收集器

牛粪字体