jvm中CPU过高,频繁Full GC如何排查呢?
今天服务器频繁FullGC,我们该如何排查呢?下文笔者将一一道来,如下所示
查看进程运行情况
# top <pid>
查看进程对应线程情况
# top -Hp <pid>
查看占用CPU过高的线程
在jsatck命令展示的结果中 线程id都转换成了十六进制形式。可以用如下命令查看转换结果: # printf "%x\n" <pid>
jstack定位CPU占用线程
80代表查看80行日志 # jstack <pid> | grep <tid 16进制> -A80 发现CPU过高的线程都是GC
查看Gc情况
可以先确定下gc是不是太频繁,使用命令来对gc分代变化情况进行观察,1000表示采样间隔(ms),1秒打印一次 # jstat -gccause <pid> 1000
经查看老年代满了,然后一秒两次GC
ps: S0C:第一个幸存区的大小 S1C:第二个幸存区的大小 S0U:第一个幸存区的使用大小 S1U:第二个幸存区的使用大小 EC:伊甸园区的大小 EU:伊甸园区的使用大小 OC:老年代大小 OU:老年代使用大小 MC:方法区大小 MU:方法区使用大小 CCSC:压缩类空间大小 CCSU:压缩类空间使用大小 YGC:年轻代垃圾回收次数 YGCT:年轻代垃圾回收消耗时间 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间
解决频繁fullGC问题的方法
经排查Tomcat永久区参数设置 -XX:PermSize 没有设置,jdk 1.6 GC每次使用74M,然后一直GC -XX:MaxPermSize=1024m 修改参数后,重启,问题解决 -XX:PermSize=256m -XX:MaxPermSize=1024m 备注说明 –设置永久区的初始空间和最大空间 -XX:PermSize 设置持久代(perm gen)初始值,物理内存的1/64 -XX:MaxPermSize 设置持久代最大值,物理内存的1/4
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。