JVM之HotSpot垃圾回收器(四)

释放双眼,带上耳机,听听看~!

HotSpot垃圾回收器

HotSpot垃圾回收器也分为好多种,请看下图概述:

通过HotSpot内存管理机制来实现新生代和旧生代的垃圾回收器如下
新生代可以使用的垃圾回收器为:

  • Serial Copying
  • Parallel Scavenge
  • ParNew

旧生代可以使用的垃圾回收器为:

  • Serial MSC(Serial Old)
  • Parallel Compacting (Parallel Old)
  • CMS

新生代可用GC

新生代可用的三种垃圾回收器如下:

  1. Serial Copying/串行回收器/使用复制算法
  2. Parallel Scavenge/并行回收器/使用复制算法
  3. ParNew/新算法(专门对新生代进行并行回收)

以上三种算法均使用复制算法Copying,原理上是一致的;

  1. 拷贝Eden和From中的存活对象到To中。
  2. 部分对象由于某些原因晋升到Old中。
  3. 清空Eden、From、From和To交换身份直到下一次GC发生。

触发条件:分配新对象时,Eden空间不足时触发GC。

Serial Copying串行回收器

1.特性:

  • Serial串行回收
  • Stop-the-world 停止整个应用,时间可能会很长

2.适用场景:
*. 单核CPU、新生代小、对暂停要求不高的应用;
*. 是Client级别或32为Windows上的默认选择,(JVM可以设置为Client和Server,单核心CPU默认为Client)

3.对象直接分配在Old的情况如下:

  • 对象大小超过Eden Space新生代空间大小
  • 大对象(PretenureSizeThreshold),大对象为通过此值超过设置的阈值,则为大对象

4.晋升规则:

  • 经历多次Minor GC仍然存活的对象;
  • To Survivor放不下的(To空间满或者剩余空间不够)对象直接晋升

5.串行回收器原理:

红色表示GC线程,绿色表示应用线程。

这种回收器就是以单线程的方式收集,即在整个扫描和复制过程采用单线程的方式来进行,垃圾回收的时候其他线程也不能工作,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,主要在JDK1.5之前的垃圾回收方式。

6.配置参数

-XX:+UseSerialGC            #表示开启串行回收器
-XX:MaxGCPauseMillis=100    #设置每次新生代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。

Parallel Scanvenge并行回收器

1.特性:

  • Parallel并行回收
  • Stop-the、world 并行停止整个应用,时间可能会很长
  • 并行线程数默认值:
    • CPU核心数量小于等于8,那么GC线程数量等于CPU核心数量
    • CPU核心数量大于8,那么GC线程数量等于(3 + CPU核心数量5)/8;假如CPU核心数量为12,则125=60+3=63/8≈8,并发线程数为8
    • 也可以强制行指定线程数量 -XX:ParallelGCThreads=8
  • 并行回收会根据Minor GC的频率、时间等动态调整Eden/S0/S1的大小,当然也可以去取消此特性 -XX:-UseAdaptiveSizePolicy

2.使用场景

  • 多CPU、对暂停要求较短的应用;
  • 是Server级别(2核心CPU 2G内存)机器上的默认选择

3.对象直接分配在Old的情况

  • 在TLAB和Eden上分配失效,且对象大于Eden的一半大小。
  • PretenureSizeThreshold参数大小设置无效的情况下

4.晋升规则

  • 经历多次Minor GC仍然存活的对象,规则和参数都比Serial Copying串行垃圾回收器复杂
  • To Survivor放不下的对象直接被晋升到Old

5.并行回收器原理
红色表示GC线程,绿色表示应用线程。

适用于多CPU,对暂停时间较短的应用上,是Server级别默认采用的GC方式。此配置仅对年轻代有效。
这种回收器就是以多线程的方式进行收集,即在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式。

6.配置参数

-XX:+UseParallelGC          #表示开启并行回收器
-XX:ParallelGCThreads=8     #表示指定并行回收器的线程数量
-XX:-UseAdaptiveSizePolicy  #取消动态调整Eden/S0/S1的大小

ParNew 新生代串行新回收器

ParNew是一种基于串行回收器的升级版本,原理基于Serial Copying,但是使用了多线程
1.特性:

  • parallel并行回收
  • Stop-the-world 并行停止整个应用,时间可能会很长
  • 当旧生代使用CMS回收器的时候,可以与其搭配使用;
  • 当旧生代使用Parallel Old回收器的时候,新生代不可以使用ParNew回收器

旧生代可用GC

旧生代可用的三种垃圾回收器如下:

  1. Serial MSC(Serial Old)/串行回收器
  2. Parallel Compacting(Parallel Old)/并行回收器
  3. CMS/并发回收器

Serial MSC(Serial Old)

串行回收适用于旧生代的算法
1.特性:

  • Serial串行回收
  • Stop-the-world 并行停止整个应用,时间可能会很长

2.算法

  • Mark-Sweep-Compact 标记-清除-压缩算法

3.缺点

  • 由于是单线程,GC造成的暂停时间会很长,在标记、清除、压缩三个过程中均为暂停状态,当暂停的过程中可使用
    -XX:+PrintGCApplicationStoppedTime 查看暂停了多长时间

4.适用场景

  • 是Client级别或32位Windows上的默认选择

5.串行回收器原理
同新生代中的Serial Copying回收原理一致

6.配置参数

-XX:+UseSerialGC            #表示开启串行回收器

Parallel Compacting

并行回收适用于旧生代的算法
1.特性:

  • Parallel并行回收
  • Stop-the-world 并行停止整个应用,时间可能会很长

2.算法

  • Mark-Compact 标记-压缩

3.使用场景:

  • 多核CPU、对暂停时间较为敏感的应用;
  • 是Server级别(2核CPU 2G内存)机器上默认的选择

4.并行回收器原理
同新生代中的Parallel Scanvenge并行回收器原理一致

5.配置参数

-XX:+UseParallelOldGC       #配置年老代垃圾收集方式为并行收集,JDK1.6开始支持对年老代并行收集 

6.Parallel Compacting算法详细概述

  • Mark标记阶段:
  • 根据GC线程数量对JVM堆内存划分相应的区域(Region)
  • 多个线程并行做Mark标记
  • Summary整理阶段
  • 多个区域进行串行扫描,找到一个值得压缩的区域Region
  • 计算之后区域Region中存活对象的目标地址
  • Compact压缩阶段
  • 多个线程对多个区域进行并行向同一个区域进行压缩,留出其它区域为空闲内存

CMS

CMS为并发回收器
1.特性

  • Parallel 并行
  • Concurrent 并发,与前几个回收器不同的是并发不需要stop-the-world
  • 缩短GC的暂停时间,但是相当复杂,增加了GC总时间
  • 默认并发线程数=(新生代GC线程数+3)/4,也可以使用 -XX:ParallelCMSThreads=4 来指定
  • 对永久代Perm Generation也启用CMS:
    -XX:+CMSPermGenSweepingEnabled
    -XX:+CMSClassUnloadingEnabled

2.算法

  • 标记清除 mark-sweep

3.适用场景

  • 暂停时间短,对追求最快响应速度的应用,尤其是互联网应用很适用

4.缺点

  • CMS所使用的算法本身很复杂,然后又并发执行,所以很消耗CPU资源,与应用抢占CPU
  • GC总耗时长
  • 浮动垃圾(Concurrent Sweep并发清除阶段有新的垃圾产生,只能下一次GC时被收集)
    GC同时应用也正在运行——》Old需要预留空间,当旧生代达到一定比例即触发GC
    -XX:CMSInitiatingOccupancyFraction=68,设定此参数可以当Old空间达到68%的时候就进行一次大GC Full GC,68%是默认值`
    如果预留空间不够,则出现Concurrent Mode Failure。如果出现了并发模式失败则将CMS垃圾回收器临时降低到Serial MSC。
  • 内存碎片,CMS采用的算法默认没有压缩内存,如果再没有压缩内存的情况下内存碎片较多,导致堆内存中没有合适内存空间来分配对象,只能触发full GC,不过可以通过增加以下配置来缓解
    -XX:+UseCMSCompactAtFullCollection参数表示每次full GC后都进行压缩
    -XX:CMSFullGCsBeforeCompaction=4参数表示多少次full GC后进行压缩,这里为4次
  • Minor GC耗时增长(每次Promotion都要搜索free list)

5.CMS并发收集器算法描述
CMS并发收集器工作原理如下:
1.Initial Mark初始标记阶段:标记GC Root可以直达的对象,所以耗时很短。需要串行执行,而串行执行的特性需要Stop the World,但是耗时很短。
2.Concurrent Mark并发标记:从Initial Mark标记过的对象触发,并发执行直达标记的对象,无需Stop the World。
3.Remark重新标记:重新进行标记,修正Concurrent Mark期间由于用户程序运行而导致对象关系间的变化和新创建的对象,但是耗时也非常短。
4.Concurrent Sweep并发清除:并行地进行无用对象的回收,无需Stop the World。

下图中1-3步都是进行标记,初始标记-并发标记-重新标记,只有第4步为清除操作。

6.CMS并发垃圾回收器配置

-XX:+UseConcMarkSweepGC                 #开启并发垃圾回收器
-XX:ParallelCMSThreads=4                #指定并发回收器线程数
-XX:+CMSPermGenSweepingEnabled          #为永久代启用CMS并发垃圾回收器
-XX:+CMSClassUnloadingEnabled           #为永久代启用CMS并发垃圾回收器
-XX:CMSInitiatingOccupancyFraction=68   #当旧生代空间达到多少后就进行一次大GC Full GC
-XX:+UseCMSCompactAtFullCollection      #每次大GC后都对空闲内存进行压缩
-XX:CMSFullGCsBeforeCompaction=4        #每4此大GC后对空闲内存进行压缩(建议适用此选项)

永久代可用GC

当永久代和旧生代触发GC时,除CMS回收器外的其它回收器外均会触发Full GC

  1. 首先按照新生代配置的GC回收器进行Minor GC
  2. 再按照旧生代配置的GC回收器对旧生代核永久代进行GC
  3. 当JVM估计Minor GC后可能会发生晋升失败,则直接采用旧生代配置的GC方式对新生代、旧生代以及永久代进行 Full GC
    -XX:+UseParallelOldGC
    -XX:+UseConcMarkSweepGC

组合

新生代和旧生代的垃圾回收器支持的组合如下

1)适合单CPU或者小内存的单机程序

垃圾回收器 GC方式 开启参数
新生代 Serial Copying 串行 -XX:+UseSerialGC
旧生代 Serial MSC(Serial Old) 串行 -XX:+UseSerialGC

2)适合多CPU,需要大吞吐量,如后台计算型应用(如搜索引擎、批处理、流处理应用)

垃圾回收器 GC方式 开启参数
新生代 Parallel Scavenge 并行 -XX:+UseParallelGC
旧生代 Parallel Compacting 并行 -XX:+UseParallelOldGC

3) 适合生产环境Web服务器使用,例如快速响应的互联网应用,如果旧生代设置不当会导致CMS降级到Serial MSC

垃圾回收器 GC方式 开启参数
新生代 ParNew 串行多线程 -XX:+ParNewGC
旧生代 CMS 并发 -XX:+UseConcMarkSweepGC

4)以下两种不太实用

垃圾回收器 GC方式 开启参数
新生代 Serial Copying 串行 -XX:+UseSerialGC
旧生代 CMS 并发 -XX:+UseConcMarkSweepGC
垃圾回收器 GC方式 开启参数
新生代 Parallel Scavenge 并行 -XX:+UseParallelGC
旧生代 Serial MSC(Serial Old) 串行 -XX:+UseSerialGC

5)自动选择GC方式

  • 吞吐量优先 -XX:GCTimeRatio=n
  • 暂停时间优先 -XX:MaxGCPauseMillis=n

本章完 下章讲解JVM性能调优

人已赞赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索