Java進(jìn)程CPU使用率過(guò)高排查步驟詳細(xì)講解
前言
當(dāng)Java應(yīng)用進(jìn)程出現(xiàn)CPU使用率長(zhǎng)期處于100%或異常波動(dòng)時(shí),需要系統(tǒng)性地排查原因。本文將從初步定位、中級(jí)分析到代碼調(diào)優(yōu),分步驟展示排查流程。
一、初步定位問(wèn)題
1.1 確認(rèn)進(jìn)程狀態(tài)
# 查看進(jìn)程CPU占用前十 ps -eo %cpu,pid,args | sort -nr | head -n 10 # 實(shí)時(shí)監(jiān)控進(jìn)程CPU和內(nèi)存(htop需提前安裝) htop
1.2 確定Java進(jìn)程ID
# 列出所有Java進(jìn)程 jps -qvp # 記錄目標(biāo)進(jìn)程PID(示例PID=12345)
1.3 快速生成線程堆棧
jstack 12345 > thread_dump_1.txt # 重復(fù)采集多份堆棧(間隔1~5秒) sleep 3 && jstack 12345 > thread_dump_2.txt
二、分析線程狀態(tài)
2.1 識(shí)別異常線程
# 查找處于RUNNABLE狀態(tài)的線程數(shù) grep "_tid_" thread_dump_1.txt | grep RUNNABLE | wc -l # 搜索特定關(guān)鍵字(如阻塞、死鎖) grep -i -A 20 'blocked|waiting|infinite loop' thread_dump_1.txt
2.2 對(duì)比多份堆棧
# 定位持續(xù)活躍的線程(示例線程ID) comm thread_dump_1.txt thread_dump_2.txt | grep '==> 0x'
2.3 熱點(diǎn)方法識(shí)別(常見(jiàn)模式)
| 行為表現(xiàn) | 可能原因 | 代碼特征 |
|---|---|---|
| 單線程持續(xù)RUNNABLE | 死循環(huán)/遞歸調(diào)用/無(wú)限循環(huán) | while(true); sleep(0) |
| 線程創(chuàng)建激增 | 過(guò)度使用線程池/無(wú)限線程創(chuàng)建 | new Thread().start() |
| GC頻繁觸發(fā) | 內(nèi)存泄漏/對(duì)象生成過(guò)快 | 對(duì)象池未釋放/臨時(shí)對(duì)象堆積 |
| 同步阻塞 | 線程間互斥競(jìng)爭(zhēng) | synchronized塊/ReentrantLock |
| 定時(shí)任務(wù)激增 | 定時(shí)調(diào)度間隔設(shè)置不合理 | ScheduledExecutor的間隔過(guò)小 |
三、深度分析維度
3.1 判斷GC影響
# 檢測(cè)GC頻率(示例每秒執(zhí)行超過(guò)5次需警惕) jstat -gcutil 12345 1000 10 # 分析GC日志(需提前開(kāi)啟-verbose:gc) grep GC `jinfo -flag LogFile 12345` # 定位日志路徑
分析堆外內(nèi)存(Direct Buffer)
jmap -heap 12345 | grep 'direct memory' # 若DirectCount持續(xù)增長(zhǎng)需檢查: # NIO類(lèi)庫(kù)使用情況 # 緩沖區(qū)未釋放代碼片段
3.3 代碼級(jí)逐層穿透分析
# 使用火焰圖定位熱點(diǎn)方法 jstack 12345 | stackcollapse.pl | flamegraph.pl > flamegraph.svg # 或使用VisualVM/JMC進(jìn)行實(shí)時(shí)分析 # 右鍵目標(biāo)進(jìn)程 → Profiling → CPU → 開(kāi)始采樣
四、代碼級(jí)診斷要點(diǎn)
4.1 死循環(huán)檢測(cè)方法
// 高危模式
while(yourFlag){
// 可能未修改yourFlag的邏輯
}
// 正確實(shí)踐
AtomicBoolean flag = new AtomicBoolean(true);
while(flag.get()){
// 允許外部修改flag
Thread.yield(); // 主動(dòng)釋放CPU
}
4.2 線程池問(wèn)題排查
// 危險(xiǎn)配置示例
Executors.newCachedThreadPool(); // 激增線程池
// 優(yōu)化配置
ThreadPoolExecutor(
10, 100, 60L, TimeUnit.SECONDS,
new SynchronousQueue<>(),
new ThreadPoolExecutor.CallerRunsPolicy()
)
4.3 定時(shí)任務(wù)優(yōu)化
// 不合理用法 scheduleWithFixedDelay(task, 0, 1, MILLISECONDS); // 毫秒級(jí)并發(fā) // 合理調(diào)整 scheduleWithFixedDelay(task, 500, 500, MILLISECONDS) // 節(jié)流控制
五、預(yù)防與監(jiān)控建議
5.1 運(yùn)維優(yōu)化策略
- 設(shè)置線程數(shù)/隊(duì)列/內(nèi)存閾值告警
- 預(yù)設(shè)JVM參數(shù)優(yōu)化(如:
-XX:+UseG1GC -XX:+AggressiveOpts -XX:+UseBiasedLocking
- 定期執(zhí)行 jinfo -flags 驗(yàn)證JVM配置
5.2 代碼規(guī)范要求
- 禁止使用Thread.sleep(0)調(diào)度邏輯
- 定時(shí)任務(wù)間隔不低于100ms
- 大數(shù)據(jù)量處理需分批次處理
- NIO緩沖區(qū)及時(shí)release()
通過(guò)以上系統(tǒng)化排查流程,可以定位大部分CPU過(guò)高的問(wèn)題源。復(fù)雜場(chǎng)景應(yīng)結(jié)合多種工具交叉驗(yàn)證,并建立完善的監(jiān)控體系實(shí)現(xiàn)預(yù)防性?xún)?yōu)化。
總結(jié)
到此這篇關(guān)于Java進(jìn)程CPU使用率過(guò)高排查步驟詳細(xì)講解的文章就介紹到這了,更多相關(guān)Java進(jìn)程CPU使用率過(guò)高內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)辦公文檔在線預(yù)覽功能
java實(shí)現(xiàn)辦公文件在線預(yù)覽功能是一個(gè)大家在工作中也許會(huì)遇到的需求,這篇文章就教大家如何實(shí)現(xiàn)這一功能,感興趣的小伙伴可以了解一下2021-12-12
java中的方法重載知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了關(guān)于java中的方法重載知識(shí)點(diǎn)總結(jié),有興趣的朋友們可以跟著學(xué)習(xí)參考下。2020-02-02
Jmeter自定義函數(shù)base64加密實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Jmeter自定義函數(shù)base64加密實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Java Fluent Mybatis 聚合查詢(xún)與apply方法詳解流程篇
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國(guó)內(nèi)又以Mybatis用的多,基于mybatis上的增強(qiáng)框架,又有mybatis plus和TK mybatis等。今天我們介紹一個(gè)新的mybatis增強(qiáng)框架 fluent mybatis關(guān)于聚合查詢(xún)、apply方法詳解2021-10-10
Java關(guān)系操作符簡(jiǎn)寫(xiě)介紹
下面小編就為大家?guī)?lái)一篇Java關(guān)系操作符簡(jiǎn)寫(xiě)介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
Spring Cloud動(dòng)態(tài)配置刷新RefreshScope使用示例詳解
這篇文章主要為大家介紹了Spring Cloud動(dòng)態(tài)配置刷新RefreshScope使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
詳解MyEclipse中搭建spring-boot+mybatis+freemarker框架
這篇文章主要介紹了詳解MyEclipse中搭建spring-boot+mybatis+freemarker框架,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
SpringBoot yaml中的數(shù)組類(lèi)型取值方式
這篇文章主要介紹了SpringBoot yaml中的數(shù)組類(lèi)型取值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java診斷工具Arthas的快速入門(mén)與實(shí)踐
在Java開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到各種性能問(wèn)題、內(nèi)存泄漏、線程阻塞等問(wèn)題,這些問(wèn)題往往難以通過(guò)常規(guī)的日志和監(jiān)控工具來(lái)定位和解決,Arthas作為一款開(kāi)源的Java診斷工具,提供了強(qiáng)大的實(shí)時(shí)監(jiān)控和診斷功能,本文將詳細(xì)介紹Arthas的安裝、基本使用以及一些常用命令2025-02-02

