CPU虛高故障分析

總結步驟:

1,使用命令top -p <pid> ,顯示你的java進程的內存狀況,pid是你的java進程號,好比123
2,按H,獲取每一個線程的內存狀況
3,找到內存和cpu佔用最高的線程pid,好比15248
4,執行 printf 0x%x 15248 獲得 0x3b90 ,此爲線程id的十六進制
5,執行 jstack 123|grep -A 10 3b90,獲得線程堆棧信息中3b90這個線程所在行的後面10行
6,查看對應的堆棧信息找出可能存在問題的代碼html

 

查看線程內存:java

top -H -p pid ,另外一種方法經過pstree pid查到pid下全部的thread 而後top查看,按下H找到對應的線程便可。服務器

 

1 故障現象

這天上午,有同事反映公司後臺管理系統運行緩慢,運維同事檢查發現cpu佔用太高,重啓服務器後故障消失。
這天下午,有同事也反映後臺系統的某模塊系統,運行緩慢,屢次重啓後故障仍然存在,使用top命令查看服務器的狀況,發現cpu佔用率接近100%。oracle

2 cpu問題定位

定位問題進程

使用了top指令查看資源佔用狀況,發現PID爲11705的進程消耗了大量的CPU資源,達到了780.4運維

定位問題線程

使用 ps -mp 11705 -o THREAD,tid,time 指令把該11705進程的thread,tid,time給列出來,
發現11707-11715 這段中的線程佔用了大量的cpu時間,各個線程佔用了12分鐘的時間。jvm

查看問題線程堆棧

挑選 11707 這個線程,查看該線程堆棧狀況。
步驟:1
先將線程id轉成16進制,
jstack pid|grep 11707 -A 30工具

步驟:2
使用jstack 打印線程堆棧信息
在打印信息中,發現該線程是JVM GC線程。那麼如今基本能夠肯定是內存不足,或內存泄漏致使gc線程持續gc 運行,cpu佔用太高。(這種狀況類是Effect Java 第一章提到的)。性能

3 內存定位

定位內存區域

使用jstat -gcutil 查看該進程的內存狀況spa

此時能夠看到:
E 100.00:伊甸區內存已滿;
O 99.98:老年代內存已滿;
FGC 117:該進程發生了117次全量GC;
GCT 908.51:該進程GC時間908秒。.net

根據以上信息,基本可肯定是程序代碼存在問題。

分析內存對象

使用jmap -histo 指令查看進程的內存對象狀況:

 

1

2

3

4

5

6

 

jmap -histo 14062 >> jmap.out

```

拉日誌出來看看,此時能夠看到,HashMap$Entry的實例數達到5000W,Integer、Double的實例數達到5000w、2000多W,三者佔用了大量的內存。

## 分析堆棧

使用jstat指令查看進程的堆棧狀況:

 

jstack 12804 >> jstat.out

`
查找相關的代碼:
發現:
發現ActivityUtil.java的477行正在使用HashMap的put方法。

4 代碼定位

打開ActivityUtil.java類,定位到477行,代碼以下:
發現 Map 的對象巨大,佔用了Map對象,使得cpu太高,應該是秒殺活動的禮品對象數據太高。

5 改進

修改代碼,對禮品進行分頁獲取。

6 總結-如何查找最高的java線程

1,使用命令top -p <pid> ,顯示你的java進程的內存狀況,pid是你的java進程號,好比123
2,按H,獲取每一個線程的內存狀況
3,找到內存和cpu佔用最高的線程pid,好比15248
4,執行 printf 0x%x 15248 獲得 0x3b90 ,此爲線程id的十六進制
5,執行 jstack 123|grep -A 10 3b90,獲得線程堆棧信息中3b90這個線程所在行的後面10行
6,查看對應的堆棧信息找出可能存在問題的代碼

 

平時用到排查JVM故障的一些命令總結:

JDK自己提供了不少方便的JVM性能調優監控工具,除了集成式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat等小巧的工具.

  1. jps,
  2. jstack
  3. jmap
  4. jhat
  5. jstat

 

# 參考

1)jvm系列(四):jvm調優-命令大全(jps jstat jmap jhat jstack jinfo)http://www.cnblogs.com/ityouknow/p/5714703.html

2)http://www.open-open.com/lib/view/open1390916852007.html

3)http://www.oracle.com/technetwork/cn/topics/entarch/jrockit-tuning-099198-zhs.html

相關文章
相關標籤/搜索