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

當CPU超過100% 或者接近100% 時有必要對線程進行排查java

1, top 找出那條進程CPU比較高 PID性能

2, top -p PID -H 打印 該PID進程下哪條線程的CPU佔用比較高 ,tidspa

3, printf "%x\n" tid 將該id進行16進制轉換 id eg:4a05線程

4, jstack PID |grep id -A 30 打印線程的堆棧信息code

在此就能夠查看形成CPU異常是由那條線程形成的了。進程

本人異常是因爲報java.lang.OutOfMemoryError: PermGen space it

查出來的異常以下io

"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 的緣由class

加大持久代的大小便可thread

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

相關文章
相關標籤/搜索