一些收藏

频繁FullGC怎么排查?

2022-05-16  本文已影响0人  嘘寒问暖

这种问题最好的办法就是结合有具体的例⼦举例分析,如果没有就说⼀般的分析步骤。发⽣FGC有可能是内存分配不合理,⽐如Eden区太⼩,导致对象频繁进⼊⽼年代,这时候通过启动参数配置就能看出来,另外有可能就是存在内存泄露,可以通过以下的步骤进⾏排查:

1. jstat -gcutil或者查看gc.log⽇志,查看内存回收情况

S0 S1 分别代表两个Survivor区占⽐

E代表Eden区占⽐,图中可以看到使⽤78%

O代表⽼年代,M代表元空间,YGC发⽣54次,YGCT代表YGC累计耗时,GCT代表GC累计耗时。

[GC [FGC 开头代表垃圾回收的类型

PSYoungGen: 6130K->6130K(9216K)] 12274K->14330K(19456K), 0.0034895 secs代表YGC前后内存使⽤情况

Times: user=0.02 sys=0.00, real=0.00 secs,user表示⽤户态消耗的CPU时间,sys表示内核态消耗的CPU时间,real表示各种墙时钟的等待时间

这两张图只是举例并没有关联关系,⽐如你从图⾥⾯看能到是否进⾏FGC,FGC的时间花费多⻓,GC后⽼年代,年轻代内存是否有减少,得到⼀些初步的情况来做出判断。

2. dump出内存⽂件在具体分析,⽐如通过jmap命令jmap -dump:format=b,file=dumpfile pid,导

出之后再通过Eclipse Memory Analyzer等⼯具进⾏分析,定位到代码,修复这⾥还会可能存在⼀个提问的点,⽐如CPU飙⾼,同时FGC怎么办?办法⽐较类似

1. 找到当前进程的pid,top -p pid -H 查看资源占⽤,找到线程

2. printf “%x\n” pid,把线程pid转为16进制,⽐如0x32d

3. jstack pid|grep -A 10 0x32d查看线程的堆栈⽇志,还找不到问题继续

4. dump出内存⽂件⽤MAT等⼯具进⾏分析,定位到代码,修复

上一篇下一篇

猜你喜欢

热点阅读