不同场景能够应用不同的垃圾收集器来进行 GC,不同的垃圾收集器有不同的特点,有的单线程执行适宜单核、有的多线程并发执行、有的谋求高吞吐量、有的谋求低提早 …
在学习垃圾收集器前须要学习肯定的前置常识如 JVM 运行时数据区、垃圾回收算法等,须要的同学能够查看该专栏下以前的文章,如
深入浅出 JVM(二)之运行时数据区和内存溢出异样
深入浅出 JVM(十二)之垃圾回收算法
深入浅出 JVM(十三)之垃圾回收算法细节
垃圾收集器的内容细节都比拟多,文章将会分为上、中、下三篇
在上篇中次要介绍垃圾回收器的分类、性能指标以及串行与并行的垃圾收集器
在中篇中次要介绍并发的垃圾收集器以及并发执行带来的问题以及解决方案
在下篇中次要介绍低提早的垃圾收集器
GC 分类与性能指标
垃圾回收器分类
依据 GC 线程数进行分类,能够分为 单 GC 线程串行和多 GC 线程并行的垃圾回收器
单线程串行顾名思义就是单线程执行 GC,多线程并行就是多个线程同时执行 GC(须要多核)
依据 GC 工作模式进行分类,能够分为 同一时刻 GC 线程独占式和用户、GC 线程并发的垃圾回收器
GC 线程独占式是 GC 线程执行时用户线程须要进展,而用户、GC 线程并发式就是用户、GC 线程并发执行
依据解决内存碎片进行分类,能够分为 压缩式(无碎片内存)和非压缩式的垃圾回收器
依据解决内存区间进行分类,能够分为 新生代、老年代的垃圾回收器
性能指标
在介绍垃圾回收器前,须要理解两个性能指标:吞吐量和提早
在程序运行时,因为 GC 的存在,在进行 GC 时须要额定的开销,咱们心愿垃圾回收器可能有高吞吐量,尽早的实现 GC,将运行工夫留给用户线程去解决咱们的程序
但因为种种原因可能导致 GC 的工夫过长,这样就会提早用户线程的执行,咱们总是心愿这种提早是低的
GC 的指标尽量谋求 高吞吐量和低提早
高吞吐量示意 GC 解决的快,低提早在交互程序中能给用户带来好的响应
然而高吞吐量和低提早是抵触的
以高吞吐量为优先,就要缩小 GC 频率,这样会导致 GC 须要更长的工夫,从而导致提早升高
以低提早为优先,为了升高每次 GC 暂停更短的工夫,只能增大 GC 频率,这样导致吞吐量升高
当初 GC 的指标是 在高吞吐量优先的状况下尽量升高提早;在低提早优先的状况下尽量增大吞吐量
垃圾收集器
以 GC 线程运行状态来分类,经典的垃圾收集器分为 串行、并行、并发垃圾收集器 ,当初还有两款 低提早垃圾收集器
串行垃圾收集器: Serial
、Serial Old
并行垃圾收集器: ParNew
、Parallel Scavenge
, Parallel Old
并发垃圾收集器: G1
、CMS
低提早垃圾收集器: ZGC
、Shenandoah
垃圾收集器可能只解决年老代(新生代)或老年代,也可能对内存区域都进行解决
因为垃圾收集器可能只解决局部空间,因而要做到 Full GC 时,须要搭配其余垃圾收集器一起进行 GC
比方 Serial GC 与 Serial Old GC(图中黑线)
图中位于红色局部是解决年老代的垃圾收集器,位于灰色局部是解决老年代的垃圾收集器,其中 G1 都会解决
垃圾收集器之间会进行搭配应用,但在高版本中可能移除这种搭配关系,也可能移除垃圾收集器
串行垃圾收集器
串行垃圾收集器次要有两种,别离解决年老代与老年代,它们相互搭配应用
Serial 收集器应用复制算法解决年老代
Serial Old 收集器应用标记 - 整顿算法解决老年代
(新生代)Serial 收集器 + (老年代)Serial Old 收集器 运行图
串行收集器(单线程),简略高效(在单线程中)、内存开销最小
收集过程中,必须暂停其余所有用户线程,直到它收集完结
默认 Client 模式的收集器,适宜单核 CPU 不适宜交互式
JVM 参数设置
-XX:+UseSerialGC
: 新生代应用 Serial GC 老年代应用 Serial Old GC
并行垃圾收集器
ParNew 收集器
ParNew 是 Serial 的并行版本,应用复制算法解决新生代
(新生代)ParNew 收集器 + (老年代)Serial Old 收集器 运行图
在单核状况下,Serial 会比 ParNew 高效;在多核状况下,ParNew 吞吐量会更高
年老代应用 ParNew 时,老年代只能应用串行的 Serial Old
JVM 参数设置
-XX:+UseParNewGC
新生代应用 ParNew
-XX:ParallelGCThreads= 线程数
并行执行的 GC 线程数量
Parallel Scavenge 收集器 和 Parallel Old 收集器
Parallel Scavenge 是 吞吐量优先的并行收集器 ,应用 复制算法解决新生代
Parallel Old 应用标记 - 整顿算法解决老年代
Parallel Scavenge 收集器 + Parallel Old 收集器运行图
与 ParNew 的不同:准确管制吞吐量,自适应调节策略
吞吐量越高阐明最高效率利用处理器资源实现程序
参数设置
-
-XX:UseParallelGC
或-XX:UseParallelOldGC
相互激活- 新生代应用 ParallelGC 老年代应用 Parallel Old GC
<!—->
-
-XX:MaxGCPauseMillis
- 最大垃圾收集进展工夫
-
-XX:GCTimeRatio
- 管制 GC 工夫
-XX:GCTimeRatio=99
时 GC 工夫占比 = 1 / (1 + 99) = 1%
- 管制 GC 工夫
-
-XX:+UseAdaptiveSizePolicy
- 自适应调节策略 默认开启
- 开启时 JVM 会依据零碎运行状况动静调整
-XX:MaxGCPauseMillis
和-XX:GCTimeRatio
参数来设置最合适的进展工夫和 GC 工夫
吞吐量优先垃圾收集器是 JDK8 默认应用的垃圾收集器
总结
本篇文章作为垃圾收集器系列文章的上篇,次要介绍从各个方面对垃圾收集器的分类、GC 性能指标、串行垃圾收集器、并行垃圾收集器等
垃圾收集器能够划分为串行、并行、并发垃圾收集器,其中串行示意单 GC 线程单独执行、并行示意多 GC 线程同时刻执行、并发示意 GC、用户线程并发执行
产生 GC 时须要思考到的性能指标是高吞吐量(GC 执行效率高)、低提早(GC 时的进展工夫尽量低),这两个指标往往不能都满足,不同的垃圾收集器有不同特点适宜在不同场景下发挥作用
串行垃圾收集器 Serial 应用复制算法回收年老代,搭配 Serial Old 应用标记 - 整顿算法回收老年代,适宜在单核、提早不敏感的场景下应用,Client 模式下的默认垃圾收集器
并行垃圾收集器 ParNew 能够看成 Serial 的并行版本,应用复制算法多 GC 线程并行回收年老代,老年代应用 Serial Old 单 GC 线程回收老年代
吞吐量优先垃圾收集器 Parallel Scavenge 应用复制算法多 GC 线程并行回收年老代,搭配 Parallel Old 应用标记 - 整顿算法多 GC 线程并行回收老年代,提供最大进展工夫、GC 工夫占比、自适应调节等参数来让用户自定义应用,Server 模式下默认垃圾收集器
并发垃圾收集器以及用户、GC 线程并发执行带来的问题与解决方案将在垃圾收集器系列的中篇介绍
低提早垃圾收集器将在垃圾收集器系列的下篇中介绍
最初(一键三连求求拉~)
本篇文章将被支出 JVM 专栏,感觉不错感兴趣的同学能够珍藏专栏哟~
本篇文章笔记以及案例被支出 gitee-StudyJava、github-StudyJava 感兴趣的同学能够 stat 下继续关注喔 \~
有什么问题能够在评论区交换,如果感觉菜菜写的不错,能够点赞、关注、珍藏反对一下 \~
关注菜菜,分享更多干货,公众号:菜菜的后端私房菜
本文由博客一文多发平台 OpenWrite 公布!