Java問題定位:CPU占用過高分析

一般在開發Java的時候,為防止占用過多的資源,對CPU和內存的占用,都會有一個要求,例如CPU不能超過70%,內存不能超過4G等,那在一般問題定位的過程中,如何和定位這些問題呢,下面簡單介紹一下CPU占用過高問題的定位方法。

Linux環境

在Linux上面,可以借助豐富的命令行工具來進行定位

  • 查找占用過高的進程

執行top命令查看CPU占用高的進程

image.png

例如我們認為上面紅框的部分為顯示的CPU占用過多的進程,可以看到,其進程號為93937,下面會多次使用這個進程號定文。

  • 查找對應的線程
    執行ps -mp 93937-o THREAD,tid,time如下
image.png

最下面的三個線程,顯示占用較高,幾乎占滿的單個CPU的時間

  • 查找對應的方法棧

這邊利用了Java自帶的jstack命令,執行一下jstack 93937,如下

image.png

如上,我們看到這幾個線程,當然真實場景會更為復雜一些,紅框的部分,是線程號,我們看到這些都是以0x打頭的,是16進制的表示,所以需要將步驟二定位出來的線程號轉換一下,可以直接在Linux命令行輸入如下命令來定位上面框出來的三個線程

printf "%x\n" 93975 16f17
printf "%x\n" 93976 16f18
printf "%x\n" 93977 16f19

正好定位到三個16進制表示的線程號,至此就找到了對應的方法棧,下面就可以直接去代碼里面查找問題了。

當然,對于此步驟,還可以一步執行如下命令定位,如下

jstack 93937 | grep $(printf "%x\n" 93975) -A 10

93937 表示進程號, 93975 表示有問題的線程號

image.png

-A 10表示多打印10行,這個可以根據不同情況設置

Windows環境

推薦使用JDK自帶的工具Java Visual VM,一般就是這貨,在JDK的bin目錄下

image.png

點開之后


image.png

左側會顯示現在正在運行的Java進程,我們隨便點開一個


image.png

可以看到此進程的一些運行信息,下面關注我們的問題,直接查看CPU的使用情況

image.png

可以清晰的看到CPU時間占用最多的線程,現在就還是利用jstack來定位具體是哪個方法
jstack.exe -l 6964 >dump.stack
然后就在輸出文件中查找對應線程名即可。

上面就是一些對CPU占用問題的簡單介紹,感謝閱讀!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容