垃圾回收器种类

该文章已生成可运行项目,

在这篇教程中我们将学习几种现有的垃圾回收器。在Java中,垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作。这篇是垃圾回 收教程系列的第三篇,在前面的第2部分我们看到了在Java中垃圾回收是如何工作的,那是篇有意思的文章,我推荐你去看一下。第一部分介绍了Java的垃 圾回收,主要有JVM体系结构,堆内存模型和一些Java术语。

Java有四种类型的垃圾回收器:

  1. 串行垃圾回收器(Serial Garbage Collector)
  2. 并行垃圾回收器(Parallel Garbage Collector)
  3. 并发标记扫描垃圾回收器(CMS Garbage Collector)
  4. G1垃圾回收器(G1 Garbage Collector)

每种类型都有自己的优势与劣势。重要的是,我们编程的时候可以通过JVM选择垃圾回收器类型。我们通过向JVM传递参数进行选择。每种类型在很大程度上有 所不同并且可以为我们提供完全不同的应用程序性能。理解每种类型的垃圾回收器并且根据应用程序选择进行正确的选择是非常重要的。

1、串行垃圾回收器

串行垃圾回收器通过持有应用程序所有的线程进行工作。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,通过冻结所有应用程序线程进行工作,所以可能不适合服务器环境。它最适合的是简单的命令行程序。

通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

2、并行垃圾回收器

并行垃圾回收器也叫做 throughput collector 。它是JVM的默认垃圾回收器。与串行垃圾回收器不同,它使用多线程进行垃圾回收。相似的是,它也会冻结所有的应用程序线程当执行垃圾回收的时候

3、并发标记扫描垃圾回收器

并发标记垃圾回收使用多线程扫描堆内存,标记需要清理的实例并且清理被标记过的实例。并发标记垃圾回收器只会在下面两种情况持有应用程序所有线程。

  1. 当标记的引用对象在tenured区域;
  2. 在进行垃圾回收的时候,堆内存的数据被并发的改变。

相比并行垃圾回收器,并发标记扫描垃圾回收器使用更多的CPU来确保程序的吞吐量。如果我们可以为了更好的程序性能分配更多的CPU,那么并发标记上扫描垃圾回收器是更好的选择相比并发垃圾回收器。

通过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾回收器。

4、G1垃圾回收器

G1垃圾回收器适用于堆内存很大的情况,他将堆内存分割成不同的区域,并且并发的对其进行垃圾回收。G1也可以在回收内存之后对剩余的堆内存空间进行压缩。并发扫描标记垃圾回收器在STW情况下压缩内存。G1垃圾回收会优先选择第一块垃圾最多的区域

通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器

Java 8 的新特性

在使用G1垃圾回收器的时候,通过 JVM参数 -XX:+UseStringDeduplication 。 我们可以通过删除重复的字符串,只保留一个char[]来优化堆内存。这个选择在Java 8 u 20被引入。

我们给出了全部的四种Java垃圾回收器,需要根据应用场景,硬件性能和吞吐量需求来决定使用哪一种。

垃圾回收的JVM配置

下面的JVM关键配置都与Java垃圾回收有关。

运行的垃圾回收器类型

配置 描述
-XX:+UseSerialGC 串行垃圾回收器
-XX:+UseParallelGC 并行垃圾回收器
-XX:+UseConcMarkSweepGC 并发标记扫描垃圾回收器
-XX:ParallelCMSThreads= 并发标记扫描垃圾回收器 =为使用的线程数量
-XX:+UseG1GC G1垃圾回收器

GC的优化配置

配置 描述
-Xms 初始化堆内存大小
-Xmx 堆内存最大值
-Xmn 新生代大小
-XX:PermSize 初始化永久代大小
-XX:MaxPermSize 永久代最大容量

使用JVM GC参数的例子

1
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar

在Java垃圾回收教程的下一部分,我们将会用一个Java程序演示如何监视和分析垃圾回收。

原文链接:  javapapers  翻译:  ImportNew.com  好好先生
译文链接:  http://www.importnew.com/13827.html
本文章已经生成可运行项目
### JVM垃圾回收器种类及其作用 #### 1. **Serial 收集器** `Serial` 是最基础的垃圾收集器之一,主要用于新生代垃圾回收。它是单线程工作的,在垃圾回收期间会触发 Stop-The-World (STW),即暂停所有用户线程。这种收集器适用于小型应用程序或嵌入式设备中的客户端模式下运行的虚拟机[^1]。 优点在于其实现简单且高效(针对单线程环境),但在现代多核处理器环境中表现不佳。 ```java // 启动 Serial GC 参数 -XX:+UseSerialGC ``` --- #### 2. **ParNew 收集器** `ParNew` 是 `Serial` 的多线程版本,专门用于新生代垃圾回收。它同样会在垃圾回收时引发 STW,但通过并行处理多个线程可以显著缩短停顿时间。因此,相比于 `Serial`,它更适配于具有多核 CPU 的服务器端应用[^3]。 虽然提高了效率,但如果堆内存较大,则仍可能出现较长的停顿时间。 ```java // 启动 ParNew GC 参数 -XX:+UseParNewGC ``` --- #### 3. **Parallel Scavenge (吞吐优先)** 这是一种专注于提升系统整体吞吐量的新生代垃圾收集器。与 `ParNew` 类似,它也是多线程运作;然而,不同于后者关注最小化停顿时间的设计理念,`Parallel Scavenge` 致力于最大化程序执行的有效时间比例[^4]。 特别适合那些对响应速度要求不高但希望获得更高性能的应用场合,例如后台批量处理任务。 ```java // 启动 Parallel Scavenge GC 参数 -XX:+UseParallelGC ``` --- #### 4. **CMS (Concurrent Mark-Sweep)** `CMS` (Concurrent Mark Sweep)是一个面向老年代的垃圾收集器,旨在提供较低的延迟体验。其核心策略是尽可能让大部分垃圾回收动作与用户的正常业务逻辑并发执行,从而减少因 STW 导致的服务中断现象[^4]。 不过,由于采用了标记-清除算法而非复制算法,容易造成内存碎片问题,进而可能需要依赖额外的 Full GC 来解决问题。 ```java // 启动 CMS GC 参数 -XX:+UseConcMarkSweepGC ``` --- #### 5. **G1 (Garbage First)** 作为一款现代化的垃圾收集器,`G1` 将整个 Java 堆划分为许多大小相等的小块区域 (`Region`),并通过预测模型来决定何时以及如何进行局部或者全局范围内的垃圾回收活动[^4]。 相比传统的分代式方法,这种方式不仅有助于更好地平衡各部分之间的负载压力,还支持更加精细地设定期望的最大停顿时间目标。 ```java // 启动 G1 GC 参数 -XX:+UseG1GC ``` --- #### 总结表 | 不同垃圾回收器的作用对比 | 名称 | 主要用途 | 特点 | |--------------------|--------------------|------------------------------------------------------------------------------------------| | Serial | 客户端模式 | 单线程、简单高效 | | ParNew | 新生代, 多核 | 多线程版 Serial,降低 STW 时间 | | Parallel Scavenge | 高吞吐量需求 | 注重吞吐量优化 | | CMS | 老年代, 低延迟 | 减少停顿时间 | | G1 | 综合优化 | 动态调整、分区管理 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值