【JVM】垃圾回收器

Java垃圾回收器详解:从Serial到G1

垃圾回收器

Serial收集器

单线程,进行垃圾收集工作时必须暂停其他所有的工作线程。STW造成了不好的用户体验。

STW: Stop-The-World: 是在垃圾回收算法执⾏过程当中,将JVM内存冻结、应用程序停顿的⼀种状态。

新生代采用复制算法,老年代采用标记整理算法。

在这里插入图片描述

Serial Old

Serial 收集器的老年代版本,它同样是一个单线程收集器。它主要有两大用途:一种用途是在 JDK1.5 以及以前的版本中与 Parallel Scavenge 收集器搭配使用,另一种用途是作为 CMS 收集器的后备方案。

ParNew收集器

常用作客户端的首选垃圾回收器,Serial的多线程版本。

为缩短STW,采用多线程GC,只负责新生代垃圾回收,可以配合cms和serial old。

弊端:需多核cpu才能发挥优势。
在这里插入图片描述

Parallel Scavenge收集器

新生代垃圾回收器,标记-复制算法的多线程收集器。Parallel Scavenge关注点是吞吐量,CMS等垃圾收集器关注点更多的是用户线程的停顿时间。

为了达到目的牺牲了新生代(调小了新生代),调小之后填满的频率提高了。通过 -XX:UseAdaptiveSizePolicy参数,可以根据当前系统运行情况调整。

在这里插入图片描述

Parallel old

多线程和标记整理算法,采用多线程标记整理算法来收集老年代。常用ps+po。

CMS收集器

Concurrent Mark Swap,并发收集低停顿。

浮动垃圾难清楚,只能等到下一次。cms要预留空间给用户线程,老年代不能填满。

一种以获取最短回收停顿时间为目标的收集器,实现了让垃圾收集线程与用户线程(基本上)同时工作,注重用户体验的应用上使用。

执行过程

  • 初始标记: 暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快 ;

  • 并发标记: 同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。

  • 重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短

  • 并发清除: 开启用户线程,同时 GC 线程开始对未标记的区域做清扫。

G1收集器

全年代的垃圾回收器。Garbage first

堆空间切成大小相等的Region,默认2048(max),每个region属于新生代或老年代(动态变化),代不连续。

新生代垃圾回收的时机是当新生代region数量扩充到了60%的时候,复制算法垃圾回收。

面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器,以极高概率满足GC停顿时间要求的同时,还具备多吞吐量性能特征。

总结

串行回收器:Serial,Serial old;
并行回收器:ParNew,Parallel scavenge,Parallel old;
并发回收器:CMS、G1;

新生代收集器:Serial,ParNew,Parallel scavenge;
老年代收集器:Serial old,Parallel old, CMS;
整堆收集器:G1;

### JVM垃圾回收器工作机制 JVM中的垃圾回收器负责管理堆内存,通过自动化的机制清理不再使用的对象。垃圾回收的核心目标是在不影响应用程序性能的前提下尽可能高效地释放无用的对象所占用的空间。 #### 垃圾回收的工作机制 垃圾回收的主要工作流程包括标记、清除和压缩三个阶段。具体来说: - **标记阶段**:GC会遍历所有的根节点(Roots),找到所有可达的对象并将其标记为存活状态[^3]。 - **清除阶段**:未被标记的对象会被视为垃圾,这些对象占据的内存空间将被释放。 - **压缩阶段**:为了减少内存碎片化,在某些类型的垃圾回收器中还会执行整理操作,即将存活的对象移动到连续的内存区域[^1]。 #### 垃圾回收器的类型及其适用场景 根据不同的设计原则和技术特性,JVM提供了多种垃圾回收器供开发者选择。以下是主要的几类垃圾回收器以及它们的特点: - **Serial GC** - 这是一个单线程工作的垃圾收集器,适用于小型应用或者客户端环境下的简单程序运行时使用[^4]。 - **Parallel GC (吞吐量优先)** - 它利用多核处理器的优势来进行并发处理,适合于后台服务端的应用场合下追求高吞吐率的需求。 - **CMS (Concurrent Mark Sweep) GC** - CMS是一种低延迟导向的设计方案,它试图在整个生命周期内保持较低暂停时间以便更好地支持交互式用户体验需求。 - **G1 (Garbage First) GC** - G1是一款面向大容量物理机器的新一代垃圾收集器, 主要针对具有大量数据集的大规模服务器系统而开发出来的一种解决方案。 - **ZGC 和 Shenandoah GC** - ZGC与Shenandoah都是实验性质较强但非常先进的技术成果,旨在进一步降低停顿时间和提高可扩展性等方面表现优异。 #### 如何优化垃圾回收过程? 对于想要提升自己Java应用性能的人来说,理解如何配置合适的参数来调整默认行为至关重要: - 避免频繁调用`System.gc()` 方法,因为它可能导致不必要的Full GC从而影响整体效率[^2]; - 使用 `-XX:+DisableExplicitGC ` 参数禁用显式的GC请求; - 调整新生代(Young Generation)大小比例(`-Xmn`) 及整个堆的最大值 (`-Xmx`); - 根据实际负载情况挑选最适合当前业务特性的GC策略; - 利用可视化工具如 JVisualVM 或者 VisualGC 来监控分析实时状况进而做出相应改进措施. ```bash java -XX:+UseG1GC -Xms512m -Xmx4g MyApplication ``` 上述命令展示了设置初始最小堆尺寸为512MB最大不超过4GB的同时启用了G1垃圾收集算法的一个例子。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值