---
title: GC分析优化
description: "每次GC过程都是对JVM堆空间的整理，JVM执行GC业务进程会进入暂停状态，GC优化的总体方向是尽可能减少对业务的影响。总体来说，GC调优是尽量降低GC频率和每次GC停顿时间。可以通过GC日志和jstat工具对GC进行实时监控分析和调优。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0066.html
sourcePath: /source/zh/perftuning/tuningtip/kunpengtuning_12_0066.html
indexId: 7af8f7574ae761881a14f60404d220d6b5aba5e4d16b722693ebb89ac0afc57058
---
# GC分析优化

#### 原理

每次GC过程都是对JVM堆空间的整理，JVM执行GC业务进程会进入暂停状态，GC优化的总体方向是尽可能减少对业务的影响。总体来说，GC调优是尽量降低GC频率和每次GC停顿时间。可以通过GC日志和jstat工具对GC进行实时监控分析和调优。


下面是jstat命令每隔1s打印的GC信息，内容只保留了GC频率和耗时相关的列信息，其他列未列出。jstat命令使用方法和输出信息说明，请参考jstat工具。

```
YGC	 YGCT			FGC	FGCT			GCT
579	 22.233			2	0.090			22.323
579	 22.233			2	0.090			22.323
579	 22.233			2	0.090			22.323
579	 22.233			2	0.090			22.323
579	 22.233			2	0.090			22.323
579	 22.233			2	0.090			22.323
579	 22.233			2	0.090			22.323
579	 22.233			2	0.090			22.323
580	 22.262			2	0.090			22.352
580	 22.262			2	0.090			22.352
580	 22.262			2	0.090			22.352
580	 22.262			2	0.090			22.352
580	 22.262			2	0.090			22.352
580	 22.262			2	0.090			22.352
580	 22.262			2	0.090			22.352
580	 22.262			2	0.090			22.352
581	 22.282			2	0.090			22.372
581	 22.282			2	0.090			22.372
581	 22.282			2	0.090			22.372
581	 22.282			2	0.090			22.372
581	 22.282			2	0.090			22.372
581	 22.282			2	0.090			22.372
581	 22.282			2	0.090			22.372
582	 22.282			2	0.090			22.372
582	 22.300			2	0.090			22.391
582	 22.300			2	0.090			22.391
582	 22.300			2	0.090			22.391
582	 22.300			2	0.090			22.391
582	 22.300			2	0.090			22.391
582	 22.300			2	0.090			22.391
582	 22.300			2	0.090			22.391
```

1. 通过上面的监控信息，YGC（Young GC/Minor GC）共执行了4次，也就是第579、580、581和582次；FGC（FULL GC）没有执行。
2. 计算GC频率：监控信息每秒打印一次，YGC标号为580的信息打印了8次，也就是说从上次GC完毕等了8s时间触发了YGC，下次打印就进入了581记录区域。也就是说YGC频率是8秒1次。同样方法可以计算FGC的频率。
3. 计算GC耗时（业务停顿时间）：YGCT表示从Java进程启动开始所有YGC累计执行的总时间，计算一次YGC耗时，只需将后一个YGC标号时间减去当前YGC标号时间即可。例如，第580次YGC执行时间为：22.282（YGCT 581标号值）减去22.262（YGCT 580标号值）的值，也就是20毫秒。同样方法可以计算FGC耗时。随业务运行压力不同，GC耗时可能会有变动。

关于GC频率和GC耗时在什么范围内比较合理这个问题，没有统一答案，它们的值和服务器硬件资源（例如内存大小、CPU处理能力）和软件相关，每个业务不尽相同。

参考建议：

- YGC平均耗时小于50毫秒
- YGC执行频率不低于10秒1次
- FGC平均耗时小于1秒
- FGC执行频率不低于10分钟1次

#### 修改方式

排查调优步骤和建议：

1. FGC过于频繁，检查业务是否有显式调用System.gc()代码，确认是否为业务触发FGC。优化业务代码删除不必要的显式调用FGC，或者设置-XX:DisableExplicitGC关闭显式调用：
  1 /path/java -XX:DisableExplicitGC <other parameters>

2. FGC过于频繁，建议尝试调大永久代（Perm区）空间大小参数值或者调大老年代空间大小参数值，具体设置参数见  设置JVM堆空间大小
。
3. YGC过于频繁，建议尝试调大年轻代空间或者调大整个堆空间，具体设置参数见  设置JVM堆空间大小
。如果业务应用对象生成过多不能重复使用，也可以尝试优化业务代码降低YGC的频率。
4. YGC耗时过长，建议尝试缩小年轻代空间大小或者调小整个堆空间，具体设置参数见  设置JVM堆空间大小
。
5. FGC/YGC耗时过长，系统CPU资源不是瓶颈场景下可尝试增加GC线程数量，具体设置方法参考  JVM线程优化
。

1. GC优化需要结合业务分析，了解业务特点再做针对性优化。
2. 堆空间调大或者调小，均会带来优点和缺点，根据业务性能关注点决定。

  a. 更大的年轻代会使老年代变小，大的年轻代会延长YGC的周期，但会增加每次YGC的耗时；小的老年代会增加FGC的频率。
  b. 更小的年轻代会使老年代变大，小的年轻代会导致YGC很频繁，但每次YGC耗时会减少；大的老年代会减少FGC的频率。
