美文网首页一些收藏
频繁FullGC怎么排查?

频繁FullGC怎么排查?

作者: 嘘寒问暖 | 来源:发表于2022-05-16 23:29 被阅读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等⼯具进⾏分析,定位到代码,修复

    相关文章

      网友评论

        本文标题:频繁FullGC怎么排查?

        本文链接:https://www.haomeiwen.com/subject/zddgurtx.html