Java 语言 GC日志分析 CMS/G1/ZGC的停顿时间与回收效率

Java阿木 发布于 2025-06-25 12 次阅读


Java GC日志分析:CMS、G1、ZGC的停顿时间与回收效率

Java虚拟机(JVM)的垃圾回收(GC)是保证Java程序稳定运行的关键机制。随着Java版本的更新,垃圾回收器也在不断进化,其中CMS(Concurrent Mark Sweep)、G1(Garbage-First)和ZGC(Z Garbage Collector)是近年来备受关注的垃圾回收器。本文将围绕这三个垃圾回收器的停顿时间和回收效率进行分析,并通过代码实现来展示如何进行GC日志分析。

CMS垃圾回收器

CMS(Concurrent Mark Sweep)垃圾回收器是一种以降低停顿时间为目标的垃圾回收器。它适用于对响应时间有较高要求的场景,如Web服务器。

停顿时间分析

CMS的停顿时间主要发生在标记和清除阶段。以下是一个简单的代码示例,用于分析CMS的停顿时间:

java

public class CMSTest {


public static void main(String[] args) {


// 启动CMS垃圾回收器


System.setProperty("java.vm.options", "-XX:+UseConcMarkSweepGC");


// 创建一个对象数组


Object[] array = new Object[1000000];


for (int i = 0; i < array.length; i++) {


array[i] = new Object();


}


// 清除对象引用


array = null;


// 触发GC


System.gc();


// 等待GC完成


try {


Thread.sleep(1000);


} catch (InterruptedException e) {


e.printStackTrace();


}


}


}


回收效率分析

CMS的回收效率可以通过分析GC日志中的“Full GC”事件来评估。以下是一个简单的代码示例,用于分析CMS的回收效率:

java

public class CMSRecyclingEfficiencyTest {


public static void main(String[] args) {


// 启动CMS垃圾回收器


System.setProperty("java.vm.options", "-XX:+UseConcMarkSweepGC");


// 创建一个对象数组


Object[] array = new Object[1000000];


for (int i = 0; i < array.length; i++) {


array[i] = new Object();


}


// 清除对象引用


array = null;


// 触发GC


System.gc();


// 读取GC日志


File gcLogFile = new File("gc.log");


try {


BufferedReader reader = new BufferedReader(new FileReader(gcLogFile));


String line;


while ((line = reader.readLine()) != null) {


if (line.contains("Full GC")) {


System.out.println(line);


}


}


reader.close();


} catch (IOException e) {


e.printStackTrace();


}


}


}


G1垃圾回收器

G1(Garbage-First)垃圾回收器是一种面向服务端应用的垃圾回收器,旨在提供可控的停顿时间和高吞吐量。

停顿时间分析

G1的停顿时间可以通过分析GC日志中的“Young GC”和“Mixed GC”事件来评估。以下是一个简单的代码示例,用于分析G1的停顿时间:

java

public class G1Test {


public static void main(String[] args) {


// 启动G1垃圾回收器


System.setProperty("java.vm.options", "-XX:+UseG1GC");


// 创建一个对象数组


Object[] array = new Object[1000000];


for (int i = 0; i < array.length; i++) {


array[i] = new Object();


}


// 清除对象引用


array = null;


// 触发GC


System.gc();


// 等待GC完成


try {


Thread.sleep(1000);


} catch (InterruptedException e) {


e.printStackTrace();


}


}


}


回收效率分析

G1的回收效率可以通过分析GC日志中的“Young GC”和“Mixed GC”事件来评估。以下是一个简单的代码示例,用于分析G1的回收效率:

java

public class G1RecyclingEfficiencyTest {


public static void main(String[] args) {


// 启动G1垃圾回收器


System.setProperty("java.vm.options", "-XX:+UseG1GC");


// 创建一个对象数组


Object[] array = new Object[1000000];


for (int i = 0; i < array.length; i++) {


array[i] = new Object();


}


// 清除对象引用


array = null;


// 触发GC


System.gc();


// 读取GC日志


File gcLogFile = new File("gc.log");


try {


BufferedReader reader = new BufferedReader(new FileReader(gcLogFile));


String line;


while ((line = reader.readLine()) != null) {


if (line.contains("Young GC") || line.contains("Mixed GC")) {


System.out.println(line);


}


}


reader.close();


} catch (IOException e) {


e.printStackTrace();


}


}


}


ZGC垃圾回收器

ZGC(Z Garbage Collector)是一种低延迟的垃圾回收器,适用于对响应时间有极高要求的场景。

停顿时间分析

ZGC的停顿时间可以通过分析GC日志中的“ZGC pause”事件来评估。以下是一个简单的代码示例,用于分析ZGC的停顿时间:

java

public class ZGCTest {


public static void main(String[] args) {


// 启动ZGC垃圾回收器


System.setProperty("java.vm.options", "-XX:+UseZGC");


// 创建一个对象数组


Object[] array = new Object[1000000];


for (int i = 0; i < array.length; i++) {


array[i] = new Object();


}


// 清除对象引用


array = null;


// 触发GC


System.gc();


// 等待GC完成


try {


Thread.sleep(1000);


} catch (InterruptedException e) {


e.printStackTrace();


}


}


}


回收效率分析

ZGC的回收效率可以通过分析GC日志中的“ZGC pause”事件来评估。以下是一个简单的代码示例,用于分析ZGC的回收效率:

java

public class ZGCRecyclingEfficiencyTest {


public static void main(String[] args) {


// 启动ZGC垃圾回收器


System.setProperty("java.vm.options", "-XX:+UseZGC");


// 创建一个对象数组


Object[] array = new Object[1000000];


for (int i = 0; i < array.length; i++) {


array[i] = new Object();


}


// 清除对象引用


array = null;


// 触发GC


System.gc();


// 读取GC日志


File gcLogFile = new File("gc.log");


try {


BufferedReader reader = new BufferedReader(new FileReader(gcLogFile));


String line;


while ((line = reader.readLine()) != null) {


if (line.contains("ZGC pause")) {


System.out.println(line);


}


}


reader.close();


} catch (IOException e) {


e.printStackTrace();


}


}


}


总结

本文通过代码示例展示了如何分析Java虚拟机中的CMS、G1和ZGC垃圾回收器的停顿时间和回收效率。在实际应用中,我们可以根据具体场景选择合适的垃圾回收器,以达到最佳的性能表现。