java運行CPU佔用太高追蹤

流程執行命令:java

1.top  查到pid 28555
2.ps aux|grep 28555 肯定到是tomcat的進程
3.顯示線程列表 ps -mp 28555 -o THREAD,tid,time   查到tid 28802
4. printf "%x\n" 28802 將線程id,tid進行16進制轉換
5.jstack pid |grep tid -A 30 顯示堆棧信息 jstack 28555 |grep 28802 -A 30tomcat

 

詳細解釋看下文:.net

 

一個應用佔用CPU很高,除了確實是計算密集型應用以外,一般緣由都是出現了死循環。線程

以咱們最近出現的一個實際故障爲例,介紹怎麼定位和解決這類問題。blog

clip_image002

根據top命令,發現PID爲28555的Java進程佔用CPU高達200%,出現故障。進程

經過ps aux | grep PID命令,能夠進一步肯定是tomcat進程出現了問題。可是,怎麼定位到具體線程或者代碼呢?ip

 

首先顯示線程列表:get

ps -mp pid -o THREAD,tid,timeit

1

找到了耗時最高的線程28802,佔用CPU時間快兩個小時了!監控

其次將須要的線程ID轉換爲16進制格式:

printf "%x\n" tid

2

最後打印線程的堆棧信息:

jstack pid |grep tid -A 30

3

找到出現問題的代碼了!

 

最後,總結下排查CPU故障的方法和技巧有哪些:

一、top命令:Linux命令。能夠查看實時的CPU使用狀況。也能夠查看最近一段時間的CPU使用狀況。

二、ps命令: Linux命令。強大的進程狀態監控命令。能夠查看進程以及進程中線程的當前CPU使用狀況。屬於當前狀態的採樣數據。

三、jstack:  Java提供的命令。能夠查看某個進程的當前線程棧運行狀況。根據這個命令的輸出能夠定位某個進程的全部線程的當前運行狀態、運行代碼,以及是否死鎖等等。

四、pstack:Linux命令。能夠查看某個進程的當前線程棧運行狀況。

相關文章
相關標籤/搜索