排查CPU超100%的方法和解释

当CPU超过100% 或者接近100% 时有必要对线程进行排查

1, top 找出那条进程CPU比较高 PID

2, top -p PID -H 打印 该PID进程下哪条线程的CPU占用比较高 ,tid

3, printf "%x\n" tid 将该id进行16进制转换 id eg:4a05

4, jstack PID |grep id -A 30 打印线程的堆栈信息

在此就可以查看造成CPU异常是由那条线程造成的了。


本人异常是由于报java.lang.OutOfMemoryError: PermGen space

查出来的异常如下


"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f8c7c016000 nid=0x4a05 runnable

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f8c7c017800 nid=0x4a06 runnable

"VM Periodic Task Thread" prio=10 tid=0x00007f8c7c12b800 nid=0x4a0e waiting on condition

是由GC造成的,接着采用jstat -gc PID 5000 打印GC情况发现 PC和PU(持久代的容量和已使用的字节已经一样大小了),这正是造成exception 的原因

加大持久代的大小即可

-XX:PermSize=64M -XX:MaxPermSize=128M

这里的两个值尽量相等,可避免JVm自己进行调整,避免性能浪费


----------------------------------万能的分隔符-------------------------------

纯属愚见,欢迎指正,共同进步


jstat -gc PID 5000 隔5s打印GC的情况

jstat -gc 18947 5000
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
 64.0   64.0   0.0    0.0   349376.0   0.0     699072.0   63239.7   83968.0 83967.9  15426   88.037 15382 3364.663 3452.700
 64.0   64.0   0.0    0.0   349376.0   0.0     699072.0   63239.7   83968.0 83967.9  15448   88.130 15404 3369.525 3457.654
 64.0   64.0   0.0    0.0   349376.0   0.0     699072.0   63239.7   83968.0 83967.9  15470   88.239 15426 3374.401 3462.640
 64.0   64.0   0.0    0.0   349376.0   0.0     699072.0   63239.7   83968.0 83967.9  15492   88.333 15448 3379.277 3467.610
 64.0   64.0   0.0    0.0   349376.0   0.0     699072.0   63239.7   83968.0 83967.9  15514   88.426 15470 3384.160 3472.586
附参数信息:

         S0C:年轻代中第一个survivor(幸存区)的容量 (字节) 
         S1C:年轻代中第二个survivor(幸存区)的容量 (字节) 
         S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节) 
         S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节) 
         EC:年轻代中Eden(伊甸园)的容量 (字节) 
         EU:年轻代中Eden(伊甸园)目前已使用空间 (字节) 
         OC:Old代的容量 (字节) 
         OU:Old代目前已使用空间 (字节) 
         PC:Perm(持久代)的容量 (字节) 
         PU:Perm(持久代)目前已使用空间 (字节) 
         YGC:从应用程序启动到采样时年轻代中gc次数 
         YGCT:从应用程序启动到采样时年轻代中gc所用时间(s) 
         FGC:从应用程序启动到采样时old代(全gc)gc次数 
         FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s) 
         GCT:从应用程序启动到采样时gc用的总时间(s) 
         NGCMN:年轻代(young)中初始化(最小)的大小 (字节) 
         NGCMX:年轻代(young)的最大容量 (字节) 
         NGC:年轻代(young)中当前的容量 (字节) 
         OGCMN:old代中初始化(最小)的大小 (字节) 
         OGCMX:old代的最大容量 (字节) 
         OGC:old代当前新生成的容量 (字节) 
         PGCMN:perm代中初始化(最小)的大小 (字节) 
         PGCMX:perm代的最大容量 (字节)   
         PGC:perm代当前新生成的容量 (字节) 
         S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 
         S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 
         E:年轻代中Eden(伊甸园)已使用的占当前容量百分比 
         O:old代已使用的占当前容量百分比 
         P:perm代已使用的占当前容量百分比 
         S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节) 
         S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节) 
         ECMX:年轻代中Eden(伊甸园)的最大容量 (字节) 
         DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满) 
         TT: 持有次数限制 
         MTT : 最大持有次数限制

你可能感兴趣的:(Linux)