当前位置: 首页 > article >正文

Java 垃圾收集器详解:CMS, G1, ZGC

Java 虚拟机(JVM)内置的垃圾收集机制是 Java 程序能够自动管理内存的关键。随着 Java 应用程序规模的增长和技术的进步,垃圾收集器的设计也在不断演进,以满足更高性能、更低延迟的需求。本文将详细介绍 CMS、G1 和 ZGC 这三种垃圾收集器,并提供一个详细的对比表格。
在这里插入图片描述

CMS(Concurrent Mark Sweep)

CMS 收集器是一种以获得最短回收停顿时间为目标的收集器,非常适合对响应时间有严格要求的应用场景。CMS 使用多线程并行执行垃圾收集工作,从而减少应用程序暂停的时间。

特点

  • 并发清理:CMS 在进行垃圾收集时,会尽量与其他应用程序线程一起工作,减少停顿时间。
  • 低停顿时间:通过并行执行,可以显著减少 GC 的停顿时间。
  • 内存碎片问题:CMS 不进行内存压缩,可能导致内存碎片。

命令行参数

启动 JVM 并指定使用 CMS 收集器可以通过以下参数:

java -XX:+UseConcMarkSweepGC -Xms200m -Xmx200m -jar yourapp.jar

代码示例

public class CMSExample {
    public static void main(String[] args) {
        byte[] placeholder;
        while (true) {
            placeholder = new byte[1024 * 1024]; // 分配1MB的空间
            placeholder = null; // 允许这个对象被收集
        }
    }
}

G1(Garbage First)

G1 是一种兼顾吞吐量和停顿时间的垃圾收集器,它将堆划分为多个大小相等的区域(region),并能独立地回收这些区域。这种设计使得 G1 能够更好地预测和控制 GC 停顿时间。

特点

  • 分区式回收:G1 将堆划分为多个小块,每一块都可以独立地被回收。
  • 可预测性:通过设置期望的最大停顿时间,G1 可以更好地适应不同应用的需求。
  • 吞吐量优化:通过选择合适的区域进行回收,可以在保证性能的同时减少停顿时间。

命令行参数

启动 JVM 并指定使用 G1 收集器可以通过以下参数:

java -XX:+UseG1GC -Xms200m -Xmx200m -jar yourapp.jar

ZGC(Z Garbage Collector)

ZGC 是为了解决大堆(数十 GB 到数 TB)下的垃圾收集问题而设计的。ZGC 的目标是在任何情况下都能保持较低的 GC 停顿时间,即使是在大堆的情况下也是如此。

特点

  • 低延迟:ZGC 设计的目标是确保 GC 停顿时间不超过 10 毫秒,无论堆的大小是多少。
  • 并发标记:ZGC 使用并发标记算法来减少应用程序的停顿时间。
  • 无碎片压缩:ZGC 在每次回收后都会进行内存压缩,以减少内存碎片。

命令行参数

启动 JVM 并指定使用 ZGC 收集器可以通过以下参数:

java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms200m -Xmx200m -jar yourapp.jar

对比表格

为了更直观地对比这几种垃圾收集器,以下是一个包含主要特性和指标的对比表格:

垃圾收集器发布版本特点主要优点主要缺点最佳使用场景
SerialJDK 1.0单线程简单,消耗资源少吞吐量低,不适合多核处理器单核机器上的小型应用
ParallelJDK 1.3多线程,吞吐量优先高吞吐量较长的停顿时间需要最大化吞吐量的应用
ParNewJDK 1.4并发,多线程年轻代收集器并发收集,适合多核处理器仅年轻代,不支持老年代多核机器上的应用
CMSJDK 5并发标记,低停顿时间低停顿时间内存碎片,不适合大堆对响应时间敏感的应用
G1JDK 7u40并发标记,分区式收集可预测停顿时间,适合大堆较高的 CPU 使用率对停顿时间和吞吐量都有要求的应用
ZGCJDK 11低延迟,无碎片压缩极低的停顿时间,适合大堆较高的内存占用对停顿时间有严格要求的大堆应用
ShenandoahJDK 9低延迟,无碎片压缩极低的停顿时间,适合大堆实验性质较强对停顿时间有严格要求的大堆应用
EpsilonJDK 11无操作收集器几乎没有 GC 开销不实际用于生产环境测试 GC 开销

命令行参数示例

以下是使用不同垃圾收集器的一些命令行参数示例:

  • Serial

    java -Xms200m -Xmx200m -jar yourapp.jar
    
  • Parallel

    java -XX:+UseParallelGC -Xms200m -Xmx200m -jar yourapp.jar
    
  • ParNew

    java -XX:+UseParNewGC -Xms200m -Xmx200m -jar yourapp.jar
    
  • CMS

    java -XX:+UseConcMarkSweepGC -Xms200m -Xmx200m -jar yourapp.jar
    
  • G1

    java -XX:+UseG1GC -Xms200m -Xmx200m -jar yourapp.jar
    
  • ZGC

    java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms200m -Xmx200m -jar yourapp.jar
    
  • Shenandoah

    java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -Xms200m -Xmx200m -jar yourapp.jar
    
  • Epsilon

    java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xms200m -Xmx200m -jar yourapp.jar
    

总结

选择合适的垃圾收集器需要综合考虑应用程序的特点和性能需求。如果需要最小化应用程序的停顿时间,可以选择 CMS 或者 ZGC;如果需要平衡吞吐量和停顿时间,则 G1 是一个不错的选择。对于大堆的应用,ZGC 和 Shenandoah 提供了极低的停顿时间,而 Parallel 和 ParNew 更适合需要高吞吐量的应用。未来随着 Java 技术的发展,新的垃圾收集器将会不断出现,以满足更多样化的需求。


http://www.kler.cn/a/310345.html

相关文章:

  • 安装SQL server中python和R
  • 密码学的基本原理
  • 应用于新能源汽车NCV4275CDT50RKG车规级LDO线性电压调节器芯片
  • 利用阿里云下载 WebRTC 源码
  • 《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
  • matlab建模入门指导
  • 国产服务器CPU发展分析
  • 「数据科学」转换数据,数据存储空间和类型转换
  • spark学习笔记
  • 基于JAVA的居家办公OA系统
  • Java中的数据脱敏与隐私保护:实现GDPR与隐私安全的最佳实践
  • c#的委托、事件
  • Red Hat 和 Debian Linux 对比
  • 异常(Exception)
  • 24年蓝桥杯及攻防世界赛题-MISC-2
  • LeetCode41. 缺失的第一个正数(2024秋季每日一题 20)
  • OpenHarmony(鸿蒙南向开发)——标准系统方案之扬帆移植案例
  • Qt安卓开发连接手机调试(红米K60为例)
  • 宠物定位技术升级,蓝牙定位让爱宠随时在线
  • 《机器学习by周志华》学习笔记-神经网络-02感知机与多层网络
  • SQL 多表联查
  • DAY60Bellman_ford 算法
  • MatchRFG:引领MemeCoin潮流,探索无限增长潜力
  • 养殖场中的分布式光伏发电
  • python画图|在3D图上画2D直方图(作图平面移动)
  • 828华为云征文|华为Flexus云服务器打造《我的世界》游戏服务器