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

發佈了24 篇原創文章 · 獲贊 20 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章