1. 程式人生 > >排查CPU超100%的方法和解釋

排查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 : 最大持有次數限制