JVM---jstack分析Java線程CPU占用,線程死鎖的解決
本文章主要演示在Windows環(huán)境,Linux環(huán)境也差不多。
一、分析CPU占用飆高
首先寫一個Java程序,并模擬一個死循環(huán)。讓CPU使用率飆高。CPU負載過大的話,新的請求就處理不了了,這就是很多程序變慢了甚至不能訪問的原因之一。
下面是我這里的Controller,啟動程序之后,開多個請求訪問這個方法。死循環(huán)代碼就不貼了,自己構(gòu)造。我這里模擬的一個截取字符串的死循環(huán)。
/** * 演示死循環(huán)導(dǎo)致cpu使用率飆高 * */ @RequestMapping("/loop") public List<Long> loop(){ return getPartneridsFromJson(); }
啟動程序,查看線程id,我這里是 796
開多個請求訪問Controller方法,可以在任務(wù)管理器看到CPU不斷增高。我開了7個窗口請求。Linux下可以通過 top命令查看CPU占用率。
現(xiàn)在發(fā)生了問題,開始定位問題。問題是我們手動構(gòu)造的,實際生產(chǎn)環(huán)境肯定比這個復(fù)雜的多。
先把Java線程信息輸出到指定文件,我這里就輸出到桌面的cpu.txt文件中,如下
某線程部分屬性說明:
jstack 796 > cpu.txt
Windows下要借助一個工具,查看系統(tǒng)進程以及線程的詳細信息:
ProcessExplorer :下載地址:ProcessExplorer
解壓,啟動,長這樣
熟悉的身影,PID為796的Java進程。CPU占用率最高。
在java.exe上右鍵選擇Properties,在彈出的窗口選擇Thread信息
可以看到7個CPU占用異常高的線程。這里的TID就是線程ID,不過是10進制的。剛剛我們jstack導(dǎo)出來的cpu.txt文件中的線程id是16進制的。
Linux下可以通過命令:
top -p 796 -H
查看線程的CPU占用率。
隨便看一個,13812轉(zhuǎn)換成16進制為:35f4,我們在cpu.txt搜一下這個線程
**可以發(fā)現(xiàn),這個線程是運行中的狀態(tài),在執(zhí)行indexOf方法。是JVMTuningController.getPartneridsFromJson這個方法。**這樣就能定位到發(fā)生問題的位置了。實際生產(chǎn)情況要比這個復(fù)雜的多。就要慢慢分析了
二、分析線程死鎖
先構(gòu)造一個死鎖方法,網(wǎng)上一搜一大把,我就不貼了。這是我的controller代碼
/** * 演示死鎖 導(dǎo)致cpu使用率飆高 * */ @RequestMapping("/deadlock") public String deadlock(){ deadLock(); }
程序跑起來,然后請求這個方法。
輸出線程信息到deadLock.txt
jstack 15808 > deadLock.txt
打開deadLock.txt,看到最后面
以上這篇JVM---jstack分析Java線程CPU占用,線程死鎖的解決就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot?注解?@AutoConfiguration?在?2.7?版本中被新增的使用方法詳解
這篇文章主要介紹了SpringBoot?注解?@AutoConfiguration?在?2.7?版本中被新增(使用方法),本文給大家介紹的非常詳細,需要的朋友可以參考下2024-09-09SpringBoot使用swagger生成api接口文檔的方法詳解
在之前的文章中,使用mybatis-plus生成了對應(yīng)的包,在此基礎(chǔ)上,我們針對項目的api接口,添加swagger配置和注解,生成swagger接口文檔,需要的可以了解一下2022-10-10SpringBoot項目中訪問HTML頁面的實現(xiàn)示例
本文主要介紹了SpringBoot項目中訪問HTML頁面的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2024-08-08淺談Java之Map 按值排序 (Map sort by value)
下面小編就為大家?guī)硪黄獪\談Java之Map 按值排序 (Map sort by value)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08Mybatis分頁插件PageHelper的配置和簡單使用方法(推薦)
在使用Java Spring開發(fā)的時候,Mybatis算是對數(shù)據(jù)庫操作的利器了。這篇文章主要介紹了Mybatis分頁插件PageHelper的配置和使用方法,需要的朋友可以參考下2017-12-12