【JVM】垃圾回收器

常用的垃圾回收器

垃圾回收器是垃圾回收算法的具体实现。 由于垃圾回收器分为年轻代和老年代,除了G1之外其他垃圾回收器必须成对组合进行使用。

Serial垃圾回收器 + SerialOld垃圾回收器

Serial是是一种单线程串行回收年轻 代的垃圾回收器。

-XX:+UseSerialGC 新生代、老 年代都使用串行回收器

回收年代和算法:年轻代复制算法 老年代标记-整理算法

优点: 单CPU处理器下吞吐量非常出色

缺点:多CPU下吞吐量不如其他垃圾回收器,堆如果偏大会让用户线程处于长时间的等待

适用场景:Java编写的客户端程序或者硬件配置有限的场景

Parallel Scavenge垃圾回收器 + Parallel Old垃圾回收器

PS+PO是JDK8默认的垃圾回收器,多线程并行回收, 关注的是系统的吞吐量。具备自动调整堆内存大小的特点。

回收年代和算法: 年轻代复制算法 老年代标记-整理算法

优点:吞吐量高,而且手动可控。为了提高吞吐量,虚拟机会动态调整堆的参数

缺点:不能保证单次的停顿时间

适用场景:后台任务,不需要与用户交互,并 且容易产生大量的对象 比如:大数据的处理,大文件导出

年轻代-ParNew垃圾回收器

ParNew垃圾回收器本质上是对Serial在多 CPU下的优化,使用多线程进行垃圾回收

-XX:+UseParNewGC 新生代使用ParNew 回收器,老年代使用串行回收器

回收年代和算法: 年轻代 复制算法

优点:多CPU处理器下停顿时间较短

缺点:吞吐量和停顿时间不如G1, 所以在JDK9之后不建议使用

适用场景:JDK8及之前的版本中,与CMS 老年代垃圾回收器搭配使用

老年代-CMS(Concurrent Mark Sweep)垃圾回收器

CMS垃圾回收器关注的是系统的暂停时间, 允许用户线程和垃圾回收线程在某些步骤中 同时执行,减少了用户线程的等待时间。

参数:-XX:+UseConcMarkSweepGC

回收年代和算法: 老年代 标记清除算法

**优点 :**系统由于垃圾回收出现的停 顿时间较短,用户体验好

缺点: 1、内存碎片问题 2、退化问题 3、浮动垃圾问题

**适用场景 :**大型的互联网系统中用户请求数 据量大、频率高的场景 比如订单接口、商品接口等

CMS垃圾回收器存在的问题

1、CMS使用了标记-清除算法,在垃圾收集结束之后会出现大量的内存碎片,CMS会在Full GC时进行碎片的整理。 这样会导致用户线程暂停,可以使用-XX:CMSFullGCsBeforeCompaction=N 参数(默认0)调整N次Full GC之 后再整理。

2.、无法处理在并发清理过程中产生的"浮动垃圾",不能做到完全的垃圾回收。

3、如果老年代内存不足无法分配对象,CMS就会退化成Serial Old单线程回收老年代。

4、并发阶段会影响用户线程执行的性能

G1 -- Garbage First 垃圾回收器

参数1: -XX:+UseG1GC 打开G1的开关, JDK9之后默认不需要打开

参数2:-XX:MaxGCPauseMillis=毫秒值 最大暂停的时间

**回收年代和算法:**年轻代+老年代 复制算法

优点: 对比较大的堆如超过6G的堆回收 时,延迟可控 不会产生内存碎片 并发标记的SATB算法效率高

**缺点 :**JDK8之前还不够成熟

**适用场景:**JDK8最新版本、JDK9之后建 议默认使用

什么是Shenandoah?

Shenandoah 是由Red Hat开发的一款低延迟的垃圾收集器,Shenandoah 并发执行大部分 GC 工作,包括并 发的整理,堆大小对STW的时间基本没有影响。

什么是ZGC?

ZGC 是一种可扩展的低延迟垃圾回收器。ZGC 在垃圾回收过程中,STW的时间不会超过一毫秒,适合需要低延 迟的应用。支持几百兆到16TB 的堆大小,堆大小对STW的时间基本没有影响。

垃圾回收器的技术演进

相关推荐
周末也要写八哥3 小时前
多进程和多线程的特点和区别
java·开发语言·jvm
Engineer邓祥浩10 小时前
JVM学习笔记(6) 第二部分 自动内存管理 第5章节 调优案例分析与实战
jvm·笔记·学习
墨神谕12 小时前
解释执行与JIT
jvm
滑德友14 小时前
jvm的metaSpace内存溢出问题排查
jvm
sinat_2554878115 小时前
泛型:类·学习笔记
java·jvm·笔记·学习
闻哥16 小时前
Docker Swarm 负载均衡深度解析:VIP vs DNSRR 模式详解
java·运维·jvm·docker·容器·负载均衡
yangyanping201081 天前
Go语言学习之对象关系映射GORM
jvm·学习·golang
Barkamin1 天前
多线程简单介绍
java·开发语言·jvm
「QT(C++)开发工程师」2 天前
C++17三大实用特性详解:内联变量、std::optional、std::variant
jvm·c++
她说..2 天前
Java Object类与String相关高频面试题
java·开发语言·jvm·spring boot·java-ee