Fork me on GitHub

【性能测试】JVM自带内存分析工具详解

一、Jstat使用(重点)

Jstat命令是jvm调优非常重要,且非常有效的命令。具体用法如下:

1. 垃圾回收统计 jstat -gc

jstat -gc 进程id
这个命令非常常用,在线上有问题的时候,可以通过这个命令来分析问题。

下面我们来测试一下,启动一个项目,然后在终端驶入jstat -gc 进程id,得到如下结果

上面的参数分别是什么意思呢?先识别参数的含义,然后根据参数进行分析

S0C: 第一个Survivor区的容量
S1C: 第二个Survivor区的容量
S0U: 第一个Survivor区已经使用的容量
S1U:第二个Survivor区已经使用的容量
EC: 新生代Eden区的容量
EU: 新生代Eden区已经使用的容量
OC: 老年代容量
OU:老年代已经使用的容量
MC: 方法区大小(元空间)
MU: 方法区已经使用的大小
CCSC:压缩指针占用空间
CCSU:压缩指针已经使用的空间
YGC: YoungGC已经发生的次数
YGCT: 这一次YoungGC耗时
FGC: Full GC发生的次数
FGCT: Full GC耗时
GCT: 总的GC耗时,等于YGCT+FGCT
连续观察GC变化的命令

jstat -gc 进程ID 间隔时间 打印次数
举个例子:我要打印10次gc信息,每次间隔1秒

jstat -gc 进程ID 1000 10

这样就连续打印了10次gc的变化,每次隔一秒。

这个命令是对整体垃圾回收情况的统计,下面将会差分处理。

3.新生代垃圾回收统计
命令:

jstat -gcnew 进程ID [ 间隔时间 打印次数]
这个指的是当前某一次GC的内存情况

S0C:第一个Survivor的大小
S1C:第二个Survivor的大小
S0U:第一个Survivor已使用大小
S1U:第二个Survivor已使用大小
TT: 对象在新生代存活的次数
MTT: 对象在新生代存活的最大次数
DSS: 期望的Survivor大小
EC:Eden区的大小
EU:Eden区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
4. 新生代内存统计
jstat -gcnewcapacity 进程ID

参数含义:

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:Survivor 1区最大大小
S0C:当前Survivor 1区大小
S1CMX:Survivor 2区最大大小
S1C:当前Survivor 2区大小
ECMX:最大Eden区大小
EC:当前Eden区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数
5. 老年代垃圾回收统计
命令:

jstat -gcold 进程ID

参数含义:

MC:方法区大小
MU:方法区已使用大小
CCSC:压缩指针类空间大小
CCSU:压缩类空间已使用大小
OC:老年代大小
OU:老年代已使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间,新生代+老年代
6. 老年代内存统计
命令:

jstat -gcoldcapacity 进程ID

参数含义:

OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
7. 元数据空间统计
命令

jstat -gcmetacapacity 进程ID

MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小指针压缩类空间大小
CCSMX:最大指针压缩类空间大小
CCSC:当前指针压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

 

二. GC分析

1、统计垃圾回收的堆信息 jstat -gc

每秒统计垃圾回收的堆信息,打印10次,

 参数详解:

S0C:第一个幸存区的大小,单位KB
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

如上所示的java进程,老年代空间大小为200M左右,使用的老老年代空间为100M左右,所以老年代空间充足,再看FGC与YGC,分别为3.6和4,即老年代回收次数为3.6,年轻代回收次数为4。消耗接近包含。

现在我们来看一个内存溢出的进程信息:

可以看到老年代和新生代都占用满了,并且GCT垃圾回收时间上升,但是垃圾并没有被回收调,占用依旧拉满,也就是我们常说的垃圾回收不掉信息。

 查看对应log日志程序已经产生内存泄露:

 

  

posted @ 2023-09-02 23:25  橘子偏爱橙子  阅读(133)  评论(0编辑  收藏  举报