一般在開發Java的時候,為防止占用過多的資源,對CPU和內存的占用,都會有一個要求,例如CPU不能超過70%,內存不能超過4G等,那在一般問題定位的過程中,如何和定位這些問題呢,下面簡單介紹一下CPU占用過高問題的定位方法。
Linux環境
在Linux上面,可以借助豐富的命令行工具來進行定位
- 查找占用過高的進程
執行top
命令查看CPU占用高的進程
例如我們認為上面紅框的部分為顯示的CPU占用過多的進程,可以看到,其進程號為93937,下面會多次使用這個進程號定文。
- 查找對應的線程
執行ps -mp 93937-o THREAD,tid,time
如下
最下面的三個線程,顯示占用較高,幾乎占滿的單個CPU的時間
- 查找對應的方法棧
這邊利用了Java自帶的jstack
命令,執行一下jstack 93937
,如下
如上,我們看到這幾個線程,當然真實場景會更為復雜一些,紅框的部分,是線程號,我們看到這些都是以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 表示有問題的線程號
-A 10
表示多打印10行,這個可以根據不同情況設置
Windows環境
推薦使用JDK自帶的工具Java Visual VM,一般就是這貨,在JDK的bin目錄下
點開之后
左側會顯示現在正在運行的Java進程,我們隨便點開一個
可以看到此進程的一些運行信息,下面關注我們的問題,直接查看CPU的使用情況
可以清晰的看到CPU時間占用最多的線程,現在就還是利用
jstack
來定位具體是哪個方法jstack.exe -l 6964 >dump.stack
然后就在輸出文件中查找對應線程名即可。
上面就是一些對CPU占用問題的簡單介紹,感謝閱讀!