首页 > 编程语言 >Java 垃圾收集器详解:CMS, G1, ZGC

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

时间:2024-09-19 08:52:20浏览次数:11  
标签:Java G1 收集器 停顿 jar XX ZGC yourapp

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 技术的发展,新的垃圾收集器将会不断出现,以满足更多样化的需求。

标签:Java,G1,收集器,停顿,jar,XX,ZGC,yourapp
From: https://blog.csdn.net/problc/article/details/142350220

相关文章

  • java生成随机数的四种方法
    方法一:Math.random()Math.random()方法返回的是一个介于0.0(包含)和1.0(不包含)之间的随机浮点数。1、生成0.0到1.0之间的浮点数:doublef=Math.random(); 2、生成0.0到50.0之间的双精度浮点数:doublerandomDouble=Math.random()*50; 3、生成大写字母:charch=(ch......
  • 《深入理解 Java 线程池:高效管理线程的利器》
    线程池1.什么是线程池?​线程池内部维护了若干个线程,没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,线程池会创建一个新线程进行处理或者放入队列(工作队列)中等待。2.线程池常用类和接口​在Java标......
  • java基础 -IO流笔记
    610,文件的基础知识文件流 输入流和输出流都是相对java程序内存而言 611,创建文件 在D盘下创建文件。packagecom.hspedu.file;importorg.junit.jupiter.api.Test;importjava.io.File;importjava.io.IOException;//演示创建文件publicclassFileCreate{......
  • MySQL 触发器的创建、使用及在 Java 中的调用
    在数据库管理中,MySQL的触发器是一种强大的工具,它可以在特定的数据库事件发生时自动执行一系列操作。同时,我们还可以在Java应用程序中与这些触发器进行交互,实现更复杂的业务逻辑。今天,我们就来一起探讨如何在MySQL中创建和使用触发器,并在Java中调用它们。一、MySQL中创建和......
  • 模拟创建分类.java
    Category.javapublicclassCategory{privateLongid;privateStringname;privateintpostCount;publicCategory(){}publicCategory(Stringname){this.name=name;}publicCategory(Stringname,intpostC......
  • Java-数据结构-优先级队列(堆)-(一) (;´д`)ゞ
    文本目录:❄️一、优先级队列:     ➷1、概念:❄️二、优先级队列的模拟实现:     ➷1、堆的概念:     ➷ 2、堆的性质:      ➷ 3、堆的创建: ▶向下调整:       ➷ 4、堆的插入和删除:    ▶堆的插入: ☞......
  • Java大小端转换 Java大端转小端 Java小端转大端
    Java大小端转换Java大端转小端Java小端转大端写在前面Java字节转大端整数Java整数转大端字节Java数组转小端整数Java大小端转换提醒写在前面一段内存地址的两边分为高位和低位,就像鸡蛋的两边,大的一端称为大端,小的一段称为小端。在内存地址的高位存储内存的低地址......
  • java-基于springboot实现家教管理系统
    摘要传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装家教管理系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,家教管理系统的有效运......
  • JavaScript语法入门七 数据类型
     BigInt类型在JavaScript中,“number”类型无法代表大于 253(或小于 -253)的整数。此时可以使用BigInt类型。使用方法:在数字的尾部附加一个n。constbigInttest=12345678901234567890123456789012345678901121345526789n; String类型js中只有String类型没有char类型。定义时......
  • 【面试经验】2024年9月滴滴后端笔试 java
    比较简单,两题编程。选择题好像是20题,有部分不确定,有C++的几题。题目记不清了,凭印象写一下。编程题第一题充电第一题:n个玩具,m电量,尽可能让一个大的区间内的玩具的电量充满。输出充满电的玩具个数。双指针+滑动窗口。importjava.util.Scanner;publicclassMa......