jstat -gc命令用于显示Java虚拟机的垃圾回收统计信息,输出的结果包含以下列:
- S0C:当前survivor space 0的容量(KB)
- S1C:当前survivor space 1的容量(KB)
- S0U:当前survivor space 0已使用的空间(KB)
- S1U:当前survivor space 1已使用的空间(KB)
- EC:当前eden space的容量(KB)
- EU:当前eden space已使用的空间(KB)
- OC:当前old space的容量(KB)
- OU:当前old space已使用的空间(KB)
- MC:当前metaspace的容量(KB)
- MU:当前metaspace已使用的空间(KB)
- CCSC:当前compressed class space的容量(KB)
- CCSU:当前compressed class space已使用的空间(KB)
- YGC:从应用程序启动到采样时发生young generation垃圾回收的次数
- YGCT:从应用程序启动到采样时young generation垃圾回收所用的时间(秒)
- FGC:从应用程序启动到采样时发生full GC的次数
- FGCT:从应用程序启动到采样时full GC所用的时间(秒)
- CGC:从应用程序启动到采样时发生concurrent GC的次数
- CGCT:从应用程序启动到采样时concurrent GC所用的时间(秒)
- GCT:从应用程序启动到采样时垃圾回收所用的总时间(秒)
示例:
代码语言:javascript复制jstat -gc 1 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCT
0.0 4096.0 0.0 4096.0 309248.0 236544.0 183296.0 125409.0 140168.0 135553.7 15488.0 13814.7 236 3.545 0 0.000 12 0.188 3.733
命令 jstat -gc 1 表示每隔1毫秒就输出一行结果。
第一行表示在应用程序启动后第一次采样时,各个内存区域和垃圾回收的情况。
例如,你可以看到:
S0C是0.0,表示survivor space 0没有分配任何空间;
S1C是4096.0,表示survivor space 1分配了4096 KB的空间;
S0U是0.0,表示survivor space 0没有使用任何空间;
S1U是4096.0,表示survivor space 1已经使用了全部空间;
EC是309248.0,表示eden space分配了309248 KB的空间;
EU是236544.0,表示eden space已经使用了236544 KB的空间;
OC是183296.0,表示old space分配了183296 KB的空间;
OU是125409.0,表示old space已经使用了125409 KB的空间;
MC是140168.0,表示metaspace分配了140168 KB的空间;
MU是135553.7,表示metaspace已经使用了135553.7 KB的空间;
CCSC是15488.0,表示compressed class space分配了15488 KB的空间;
CCSU是13814.7,表示compressed class space已经使用了13814.7 KB的空间;
YGC是236,表示从应用程序启动到采样时发生了236次young generation垃圾回收;
YGCT是3.545,表示从应用程序启动到采样时young generation垃圾回收花费了3.545秒;
FGC是0,表示从应用程序启动到采样时没有发生full GC;
FGCT是0.000,表示从应用程序启动到采样时full GC花费了0秒;
CGC是12,表示从应用程序启动到采样时发生了12次concurrent GC;
CGCT是0.188,表示从应用程序启动到采样时concurrent GC花费了0.188秒;
GCT是3.733,表示从应用程序启动到采样时垃圾回收花费了总共3.733秒。
参考:
(1) The jstat Command - Oracle. https://docs.oracle.com/en/java/javase/14/docs/specs/man/jstat.html
(2) java - Interpreting jstat results - Stack Overflow. https://stackoverflow.com/questions/14464987/interpreting-jstat-results
(3) jstat命令详解_zhaozheng7758的博客-CSDN博客. https://blog.csdn.net/zhaozheng7758/article/details/8623549
(4) GitHub - jstat/jstat: JavaScript Statistical Library. https://github.com/jstat/jstat
根据,jstat -gc命令返回的结果可以用来监控Java虚拟机的内存区域和垃圾回收的情况。你可以通过以下几个方面来分析这些结果:
- 内存区域的容量和使用率:你可以通过比较各个内存区域(eden, survivor, old, metaspace, compressed class space)的容量(C)和使用空间(U)来判断内存是否充足,是否有内存泄漏的风险,是否需要调整内存参数。一般来说,如果某个内存区域的使用率(U/C)接近或超过100%,就说明该区域可能不够用,需要增加容量或者优化代码。例如,你可以看到在第一次采样时,survivor space 1的使用率是100%,eden space的使用率是76.5%,old space的使用率是68.4%,metaspace的使用率是96.7%,compressed class space的使用率是89.2%。这些都是比较高的使用率,可能会导致频繁或者长时间的垃圾回收。
- 垃圾回收的次数和时间:你可以通过比较不同类型的垃圾回收(young generation, full GC, concurrent GC)发生的次数(GC)和花费的时间(GCT)来判断垃圾回收是否频繁,是否影响应用程序的性能,是否需要调整垃圾回收器或者参数。一般来说,如果某种类型的垃圾回收发生的次数过多或者花费的时间过长,就说明该类型的垃圾回收可能存在问题,需要优化。例如,你可以看到在第一次采样时,young generation垃圾回收发生了236次,花费了3.545秒;full GC发生了0次,花费了0秒;concurrent GC发生了12次,花费了0.188秒。这些数据表明young generation垃圾回收比较频繁,可能是因为eden space或者survivor space不够用;full GC没有发生,可能是因为old space还有一定空间;concurrent GC发生了一些次数,但是花费的时间不多,可能是因为metaspace或者compressed class space还有一些空间。
参考:
(1) jstat – Analysis – GC easy – Universal Java GC Log Analyser. https://blog.gceasy.io/2019/11/18/jstat-analysis/
(2) jstat- Analysis | Codementor. https://www.codementor.io/@suryab/jstat-analysis-116fgy4jcj
(3) jstat – Analysis - Java Code Geeks - 2023. https://www.javacodegeeks.com/2019/11/jstat-analysis.html
(4) java - Interpreting jstat results - Stack Overflow. https://stackoverflow.com/questions/14464987/interpreting-jstat-results