最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java程序?qū)е翪PU打滿如何排查

 更新時(shí)間:2025年12月04日 10:35:25   作者:Freed_在路上  
本文主要介紹了Java程序CPU打滿的常見原因和排查方法,常見的原因包括死循環(huán)、高復(fù)雜度算法、線程阻塞與喚醒風(fēng)暴、線程池配置不合理、頻繁GC等,下面就來詳細(xì)的介紹一下,感興趣的可以了解一下

一、哪些情況會(huì)導(dǎo)致Java程序CPU打滿?

在開始排查前,我們先了解可能導(dǎo)致Java應(yīng)用CPU使用率飆升的常見原因:

  1. 死循環(huán)或無限遞歸

    • 特征:單個(gè)線程持續(xù)占用一個(gè)CPU核心,CPU使用率接近100%。
    • 場景:代碼邏輯錯(cuò)誤、條件判斷失誤導(dǎo)致循環(huán)無法退出。
  2. 高復(fù)雜度算法處理大量數(shù)據(jù)

    • 特征:CPU使用率隨數(shù)據(jù)量線性或指數(shù)級上升。
    • 場景:如未優(yōu)化的排序、遞歸遍歷、大數(shù)據(jù)計(jì)算等。
  3. 線程阻塞與喚醒風(fēng)暴(Lock Contention)

    • 特征:大量線程在 RUNNABLEBLOCKED 狀態(tài)間頻繁切換,引發(fā)大量上下文切換。
    • 場景:鎖競爭激烈、synchronized或ReentrantLock使用不當(dāng)。
  4. 線程池配置不合理

    • 特征:線程數(shù)過多,導(dǎo)致上下文切換開銷巨大,CPU資源被調(diào)度消耗。
    • 場景:核心線程數(shù)、最大線程數(shù)設(shè)置過大,或隊(duì)列策略不合理。
  5. 頻繁GC(垃圾回收)

    • 特征:GC線程占用大量CPU,尤其是Full GC頻繁觸發(fā)。
    • 場景:內(nèi)存泄漏、堆內(nèi)存設(shè)置不合理、對象創(chuàng)建過快。

此外,還有如正則表達(dá)式回溯、JNI調(diào)用、頻繁反射等也可能導(dǎo)致CPU飆升。

二、環(huán)境準(zhǔn)備:模擬CPU打滿場景

為了演示排查過程,我們先編寫一段模擬CPU打滿的Java代碼:

// Cpu100DemoApplication.java
public class Cpu100DemoApplication {
    public static void main(String[] args) {
        int coreCount = Runtime.getRuntime().availableProcessors();
        System.out.println("CPU核心數(shù):" + coreCount);

        for (int i = 0; i < coreCount; i++) {
            new Thread(() -> {
                while (true) {
                    // 死循環(huán)空轉(zhuǎn),持續(xù)占用CPU
                }
            }, "cpu-eater-thread-" + i).start();
        }
    }
}

操作步驟:

# 1. 編譯
javac Cpu100DemoApplication.java

# 2. 創(chuàng)建 MANIFEST
mkdir -p META-INF
cat > META-INF/MANIFEST.MF << 'EOF'
Manifest-Version: 1.0
Main-Class: Cpu100DemoApplication
Created-By: lyc
EOF

# 3. 打包
jar cvfm Cpu100Demo.jar META-INF/MANIFEST.MF Cpu100DemoApplication.class

# 4. 運(yùn)行測試
java -jar Cpu100Demo.jar

此時(shí),程序會(huì)為每個(gè)CPU核心創(chuàng)建一個(gè)死循環(huán)線程,模擬CPU打滿場景。

三、方式一:使用top + jstack定位問題

這是最基礎(chǔ)、最經(jīng)典的排查方式,適用于所有Linux環(huán)境,無需額外工具。

步驟1:使用top查看進(jìn)程CPU使用情況

top

觀察輸出,重點(diǎn)關(guān)注:

  • PID:進(jìn)程ID
  • %CPU:CPU使用率(多核系統(tǒng)下可能超過100%)
  • %MEM:內(nèi)存使用率

例如:

PID   %CPU  %MEM  COMMAND
21423 194.0 10.2  java -jar cpu-demo.jar

說明:我的服務(wù)器是2核,因此CPU最大使用率為200%。194%的使用率已接近打滿,說明進(jìn)程 21423 是問題源頭。

步驟2:查看進(jìn)程中各線程的CPU使用情況

使用 top -H 查看線程級CPU占用:

top -H -p 21423

輸出中會(huì)列出該進(jìn)程的所有線程,找到CPU使用率最高的幾個(gè)線程,例如:

  PID  %CPU  COMMAND
21444 97.0  java
21445  96.5  java

這兩個(gè)線程ID(21444、21445)極有可能是問題線程。

步驟3:將線程ID轉(zhuǎn)換為16進(jìn)制

JVM線程堆棧中的線程ID(nid)是16進(jìn)制的,需轉(zhuǎn)換:

printf '%x\n' 14898  # 輸出:3a32
printf '%x\n' 21445  # 輸出:53c5

記住這兩個(gè)值:3a3253c5。

步驟4:使用jstack查看線程堆棧

執(zhí)行命令獲取進(jìn)程的線程快照:

jstack -l 21423 > jstack.log

打開日志文件,搜索 cpu-eater

"cpu-eater-thread-0" #14 prio=5 os_prio=0 cpu=390259.69ms elapsed=395.52s tid=0x0000558fec247c50 nid=0x53c2 runnable  [0x00007f2288f78000]
   java.lang.Thread.State: RUNNABLE
        at Cpu100DemoApplication.lambda$main$0(Cpu100DemoApplication.java:8)
        at Cpu100DemoApplication$$Lambda$1/0x0000000800c00a08.run(Unknown Source)
        at java.lang.Thread.run(java.base@17.0.0.1/Thread.java:833)

定位成功! 問題出現(xiàn)在 Cpu100DemoApplication.java 死循環(huán)代碼。

四、方式二:使用 Arthas 快速診斷

Arthas 是阿里巴巴開源的Java診斷工具,被譽(yù)為“Java程序員的瑞士軍刀”。它無需修改代碼,即可實(shí)時(shí)監(jiān)控、診斷線上應(yīng)用。

1. 安裝與啟動(dòng)

# 下載
curl -O https://arthas.aliyun.com/arthas-boot.jar

# 啟動(dòng)
java -jar arthas-boot.jar

啟動(dòng)后,Arthas會(huì)列出當(dāng)前機(jī)器上所有Java進(jìn)程:

* [1]: 3439 org.elasticsearch.bootstrap.Elasticsearch
  [2]: 21423 Cpu100Demo.jar

輸入進(jìn)程ID(如 2),回車進(jìn)入監(jiān)控界面。

2. 使用thread命令定位高CPU線程

# 查看CPU使用率最高的5個(gè)線程
thread -n 5

輸出示例:

"cpu-eater-thread-3" Id=17 cpuUsage=99.95% deltaTime=210ms time=929934ms RUNNABLE
    at app//Cpu100DemoApplication.lambda$main$0(Cpu100DemoApplication.java:8)
    at app//Cpu100DemoApplication$$Lambda$1/0x0000000800c00a08.run(Unknown Source)
    at java.base@17.0.0.1/java.lang.Thread.run(Thread.java:833)


"cpu-eater-thread-4" Id=18 cpuUsage=99.89% deltaTime=210ms time=930931ms RUNNABLE
    at app//Cpu100DemoApplication.lambda$main$0(Cpu100DemoApplication.java:8)
    at app//Cpu100DemoApplication$$Lambda$1/0x0000000800c00a08.run(Unknown Source)
    at java.base@17.0.0.1/java.lang.Thread.run(Thread.java:833)

無需轉(zhuǎn)換進(jìn)制,直接顯示CPU使用率和代碼位置,定位問題更直觀、更高效!

3. Arthas的其他強(qiáng)大功能(擴(kuò)展)

  • watch:監(jiān)控方法的入?yún)?、返回值、異?/li>
  • trace:追蹤方法調(diào)用鏈,分析性能瓶頸
  • stack:查看指定方法的調(diào)用棧
  • dashboard:實(shí)時(shí)監(jiān)控系統(tǒng)、JVM、線程、內(nèi)存等狀態(tài)
  • jvm:查看JVM信息
  • ognl:執(zhí)行任意OGNL表達(dá)式,調(diào)用對象方法

Arthas讓線上問題排查從“盲人摸象”變?yōu)?ldquo;全局掌控”。

五、總結(jié)與建議

方法優(yōu)點(diǎn)缺點(diǎn)推薦指數(shù)
top + jstack原生工具,無需安裝,通用性強(qiáng)操作繁瑣,需手動(dòng)轉(zhuǎn)換進(jìn)制,信息不夠直觀????
Arthas功能強(qiáng)大,定位迅速,交互友好,支持熱修復(fù)需額外安裝,有一定學(xué)習(xí)成本?????

最佳實(shí)踐建議:

  1. 日常開發(fā)中優(yōu)先使用Arthas,提升排查效率。
  2. 掌握top + jstack作為基礎(chǔ)技能,應(yīng)對無外網(wǎng)或受限環(huán)境。
  3. 定期監(jiān)控系統(tǒng)指標(biāo),結(jié)合Prometheus + Grafana實(shí)現(xiàn)告警。
  4. 優(yōu)化代碼邏輯,避免死循環(huán)、高復(fù)雜度算法、過度創(chuàng)建線程。
  5. 合理配置JVM參數(shù)和線程池,避免資源浪費(fèi)。

結(jié)語
CPU打滿并不可怕,關(guān)鍵在于快速定位、精準(zhǔn)修復(fù)。掌握本文介紹的兩種排查方式,你將能在面對線上性能問題時(shí)從容不迫,成為團(tuán)隊(duì)中不可或缺的技術(shù)骨干。

到此這篇關(guān)于詳解Java程序?qū)е翪PU打滿如何排查的文章就介紹到這了,更多相關(guān)Java CPU打滿內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)用技巧:如何使用String去除開頭的第一個(gè)字符?

    Java實(shí)用技巧:如何使用String去除開頭的第一個(gè)字符?

    這篇文章主要介紹了Java實(shí)用技巧:如何使用String去除開頭的第一個(gè)字符,需要的朋友可以參考下
    2023-11-11
  • SpringBoot如何從配置文件中讀取配置參數(shù)

    SpringBoot如何從配置文件中讀取配置參數(shù)

    這篇文章主要介紹了SpringBoot如何從配置文件中讀取配置參數(shù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 舉例講解Java的JSON類庫GSON的基本用法

    舉例講解Java的JSON類庫GSON的基本用法

    GSON是谷歌在GitHub上開源的Java的JSON格式轉(zhuǎn)換類庫,能夠?qū)崿F(xiàn)Java對象向JSON的序列和反序列,這里我們就來舉例講解Java的JSON類庫GSON的基本用法:
    2016-06-06
  • java使用poi讀取ppt文件和poi讀取excel、word示例

    java使用poi讀取ppt文件和poi讀取excel、word示例

    這篇文章主要介紹了java使用poi讀取ppt文件和poi讀取excel、word示例,需要的朋友可以參考下
    2014-03-03
  • Java實(shí)現(xiàn)XML文件學(xué)生通訊錄

    Java實(shí)現(xiàn)XML文件學(xué)生通訊錄

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)XML文件學(xué)生通訊錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 詳解java迭代器模式

    詳解java迭代器模式

    這篇文章主要介紹了java迭代器模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 全面了解java異常

    全面了解java異常

    本文非常詳細(xì)的介紹了java異常,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們可以學(xué)習(xí)一下這篇文章
    2021-08-08
  • maven項(xiàng)目切換JDK踩坑指南分享

    maven項(xiàng)目切換JDK踩坑指南分享

    文章介紹了如何在Windows系統(tǒng)中配置多版本JDK環(huán)境,并解決環(huán)境變量配置失效的問題,同時(shí),還提供了在IntelliJ?IDEA中配置不同項(xiàng)目JDK版本的方法
    2024-11-11
  • 詳解Java的Hibernate框架中的注解與緩存

    詳解Java的Hibernate框架中的注解與緩存

    這篇文章主要介紹了詳解Java的Hibernate框架中的注解與緩存,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • SpringCloud alibaba使用Nacos配置中心解讀

    SpringCloud alibaba使用Nacos配置中心解讀

    本文介紹了如何在Spring Boot項(xiàng)目中使用Spring Cloud Alibaba和Nacos進(jìn)行依賴管理、配置管理及配置刷新,通過添加BOM和配置文件,可以簡化依賴版本的管理,并實(shí)現(xiàn)配置的動(dòng)態(tài)刷新,同時(shí),還展示了如何通過自定義DataId進(jìn)行配置管理,并詳細(xì)介紹了各種配置方式的優(yōu)先級
    2026-01-01

最新評論

丘北县| 吉林省| 富裕县| 桃园市| 玉溪市| 望奎县| 灯塔市| 绿春县| 宜都市| 离岛区| 株洲市| 固原市| 虎林市| 白沙| 伊川县| 九江县| 东明县| 凤凰县| 扎囊县| 长顺县| 郧西县| 鄢陵县| 濮阳县| 廊坊市| 彭水| 龙门县| 罗田县| 和平县| 兴安盟| 礼泉县| 如东县| 乐业县| 泰州市| 青川县| 含山县| 都安| 轮台县| 慈利县| 德清县| 菏泽市| 双牌县|