JVM垃圾回收器

jdk8默认垃圾回收器

在jdk1.8中,垃圾回收器新生代默认使用的是:parallel scanvenge,标记-复制法。

老年代使用的是:parallel old.标记-整理法。

垃圾回收器对比

垃圾回收器
串行,并行,并发
垃圾回收算法
作用域
目标
特点

Serial

串行

复制算法

新生代

降低GC停顿时间

只有1个工作线程

Serial Old

串行

标记-整理算法

老年代

降低GC停顿时间

只有1个工作线程

ParNew

并行

复制算法

新生代

降低GC停顿时间

只是简单的将Serial多线程化

Parallel Scavenge

并行

复制算法

新生代

高吞吐量

和ParNew相似,增加了动态调节新生代和老年代比例。

Parallel Old

并行

标记-整理算法

老年代

高吞吐量

Parallel Scavenge的老年代版本

CMS

并发

标记-清除算法

老年代

降低GC停顿时间

会有内存碎片

G1

并发

分区算法

新生代+老年代

高吞吐量

高并发,低延迟。消耗的CPU和内存高

名次解释:

  1. 并行是多个CPU处理多个任务,物理上的同时发生。并发是1个CPU处理多个任务,逻辑上的同时发生。

  2. 低延迟:从发出请求到收到响应全部耗时。

  3. 吞吐量:在一定的并发下,每秒可以处理的请求数。

参数配置

参数
使用的垃圾回收器

XX:+UseSerialGC

使用Serial和Serial Old

-XX:+UseParNewGC

使用ParNew和Serial Old

-XX:+UseParallelGC

jdk1.9之前默认值。使用Parallel Scavenge和Serial Old

-XX:+UseParallelOldGC

使用Parallel Scavenge和Parallel Old

-XX:+UseConcMarkSweepGC

使用ParNew,CMS和Serial Old

-XX:+UseG1GC

jdk1.9之后默认值。G1

CMSGC

使用的是标记-清除法.

阶段:

  1. 初始标记:stop the word.

  2. 并发标记

  3. 重新标记:stop the word.

  4. 并发清除

优点:并发收集,低延迟.

缺点:

  1. 在并发标记和并发清除的期间,无法清除此刻产生的垃圾,从而产生”浮动垃圾”.

  2. 基于标记-清除方法实现的,会产生空间碎片化.可设置在进行full gc后,执行标记-清理.不过也会影响效率.

  3. stop the word 横跨时间长.

G one

G1 取代了parallel scanvenge 和parallel old的默认组合.G1摆脱了单纯的回收新生代(minor Gc),老年代(major gc),新生代+老年代(full gc)的思想.将可回收的区域扩展到了整个堆.根据经验值计算出回收哪块内存的性价比高,就回收哪块.(Minxed Gc).

在G1中,将堆划分为了大小相等的region.每个region可以按照需要扮演新生代或者老年代.

同时为了存储大对象,设计出Humongous区域.在进行回收的时候,将其看为老年代.

阶段:

  1. 初始标记:通常是伴随着minor gc执行,没有单独分配时间.

  2. 并发标记

  3. 最终标记:stop the word

  4. 筛选回收:stop the word

CMS和G1适用场景:

目前在小内存的应用上,CMS的表现大概率仍会优于G1,而在大内存应用上,G1则大多能发挥其优势,这个优劣势的堆容量平衡点在6-8G之间.

ZGC

更低延迟的垃圾回收器.

Last updated

Was this helpful?