一般在開發(fā)Java的時候叮叹,為防止占用過多的資源艾栋,對CPU和內(nèi)存的占用,都會有一個要求蛉顽,例如CPU不能超過70%蝗砾,內(nèi)存不能超過4G等,那在一般問題定位的過程中蜂林,如何和定位這些問題呢,下面簡單介紹一下CPU占用過高問題的定位方法拇泣。
Linux環(huán)境
在Linux上面噪叙,可以借助豐富的命令行工具來進(jìn)行定位
- 查找占用過高的進(jìn)程
執(zhí)行top
命令查看CPU占用高的進(jìn)程
例如我們認(rèn)為上面紅框的部分為顯示的CPU占用過多的進(jìn)程,可以看到霉翔,其進(jìn)程號為93937睁蕾,下面會多次使用這個進(jìn)程號定文。
- 查找對應(yīng)的線程
執(zhí)行ps -mp 93937-o THREAD,tid,time
如下
最下面的三個線程债朵,顯示占用較高子眶,幾乎占滿的單個CPU的時間
- 查找對應(yīng)的方法棧
這邊利用了Java自帶的jstack
命令,執(zhí)行一下jstack 93937
序芦,如下
如上臭杰,我們看到這幾個線程,當(dāng)然真實(shí)場景會更為復(fù)雜一些谚中,紅框的部分渴杆,是線程號寥枝,我們看到這些都是以0x
打頭的,是16進(jìn)制的表示磁奖,所以需要將步驟二定位出來的線程號轉(zhuǎn)換一下囊拜,可以直接在Linux命令行輸入如下命令來定位上面框出來的三個線程
printf "%x\n" 93975
16f17
printf "%x\n" 93976
16f18
printf "%x\n" 93977
16f19
正好定位到三個16進(jìn)制表示的線程號,至此就找到了對應(yīng)的方法棧比搭,下面就可以直接去代碼里面查找問題了冠跷。
當(dāng)然,對于此步驟身诺,還可以一步執(zhí)行如下命令定位蜜托,如下
jstack 93937 | grep $(printf "%x\n" 93975) -A 10
93937 表示進(jìn)程號, 93975 表示有問題的線程號
-A 10
表示多打印10行戚长,這個可以根據(jù)不同情況設(shè)置
Windows環(huán)境
推薦使用JDK自帶的工具Java Visual VM盗冷,一般就是這貨,在JDK的bin目錄下
點(diǎn)開之后
左側(cè)會顯示現(xiàn)在正在運(yùn)行的Java進(jìn)程同廉,我們隨便點(diǎn)開一個
可以看到此進(jìn)程的一些運(yùn)行信息仪糖,下面關(guān)注我們的問題,直接查看CPU的使用情況
可以清晰的看到CPU時間占用最多的線程迫肖,現(xiàn)在就還是利用
jstack
來定位具體是哪個方法jstack.exe -l 6964 >dump.stack
然后就在輸出文件中查找對應(yīng)線程名即可锅劝。
上面就是一些對CPU占用問題的簡單介紹,感謝閱讀蟆湖!