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

一文帶你深入解析Java應(yīng)用線程轉(zhuǎn)儲(chǔ)

 更新時(shí)間:2025年04月23日 10:46:59   作者:碼農(nóng)阿豪@新空間  
在Java應(yīng)用運(yùn)維和問題排查過程中,線程轉(zhuǎn)儲(chǔ)(Thread?Dump)是一個(gè)非常重要的工具,它能夠幫助我們了解JVM內(nèi)部線程的運(yùn)行狀態(tài),下面小編來和大家詳細(xì)介紹一下它吧

引言

在Java應(yīng)用運(yùn)維和問題排查過程中,線程轉(zhuǎn)儲(chǔ)(Thread Dump)是一個(gè)非常重要的工具,它能夠幫助我們了解JVM內(nèi)部線程的運(yùn)行狀態(tài),快速定位死鎖、線程阻塞、資源競爭等問題。本文將通過一個(gè)實(shí)際的線程轉(zhuǎn)儲(chǔ)日志案例,詳細(xì)分析其內(nèi)容,并結(jié)合代碼示例,講解如何從中發(fā)現(xiàn)問題并優(yōu)化應(yīng)用性能。

1. 什么是線程轉(zhuǎn)儲(chǔ)

線程轉(zhuǎn)儲(chǔ)是JVM在某一時(shí)刻所有線程的快照,包含每個(gè)線程的調(diào)用棧、狀態(tài)和鎖信息。通過分析線程轉(zhuǎn)儲(chǔ),我們可以:

  • 檢查線程是否阻塞或死鎖。
  • 發(fā)現(xiàn)資源競爭問題。
  • 優(yōu)化線程池配置。
  • 診斷應(yīng)用響應(yīng)緩慢或崩潰的原因。

如何獲取線程轉(zhuǎn)儲(chǔ)?

使用 jstack 命令(適用于運(yùn)行中的Java進(jìn)程):

jstack -l <pid> > thread_dump.log

通過 kill -3 發(fā)送信號(hào)(適用于Linux環(huán)境):

kill -3 <pid>

使用JMX工具(如VisualVM、JConsole)。

2. 案例日志分析

我們分析的日志片段如下:

2025-04-22 18:16:40
Full thread dump OpenJDK 64-Bit Server VM (25.362-b08 mixed mode):

"SIGTERM handler" #138 daemon prio=9 os_prio=0 tid=0x00007f03fc005000 nid=0xa9b06 runnable [0x00007f0438dfc000]
   java.lang.Thread.State: RUNNABLE
    at java.lang.Thread.run(Thread.java:749)

"Druid-ConnectionPool-Destroy-816944408" #137 daemon prio=5 os_prio=0 tid=0x00007f0364222000 nid=0xa9aff waiting on condition [0x00007f04385fc000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(DruidDataSource.java:2786)
...

關(guān)鍵線程解析

(1) SIGTERM handler 線程

狀態(tài):RUNNABLE

作用:處理JVM終止信號(hào)(如 kill -15),表明應(yīng)用正在關(guān)閉。

可能的問題:如果是非預(yù)期關(guān)閉,需檢查是否有異常終止或OOM。

(2) Druid 連接池線程

Druid-ConnectionPool-Destroy-*

  • 狀態(tài):TIMED_WAITING (sleeping)
  • 作用:銷毀閑置數(shù)據(jù)庫連接。
  • 優(yōu)化建議:調(diào)整 timeBetweenEvictionRunsMillis 參數(shù),避免頻繁銷毀。

Druid-ConnectionPool-Create-*

  • 狀態(tài):WAITING (parking)
  • 作用:創(chuàng)建新數(shù)據(jù)庫連接。
  • 潛在問題:如果長期阻塞,可能是連接池耗盡,需檢查 maxActive 配置。

(3) Nacos 客戶端線程

nacos-grpc-client-executor-*

狀態(tài):TIMED_WAITING (parking)

作用:Nacos 客戶端通過gRPC與服務(wù)端通信。

排查點(diǎn):如果大量線程阻塞,可能是Nacos服務(wù)端不可達(dá)或網(wǎng)絡(luò)問題。

3. 常見問題及解決方案

3.1 線程死鎖

示例代碼:

public class DeadlockExample {
    private static final Object lock1 = new Object();
    private static final Object lock2 = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (lock1) {
                try { Thread.sleep(100); } catch (InterruptedException e) {}
                synchronized (lock2) {
                    System.out.println("Thread 1");
                }
            }
        }).start();

        new Thread(() -> {
            synchronized (lock2) {
                synchronized (lock1) {
                    System.out.println("Thread 2");
                }
            }
        }).start();
    }
}

線程轉(zhuǎn)儲(chǔ)中的死鎖表現(xiàn):

Found one Java-level deadlock:
=============================
Thread 1:
  waiting to lock monitor 0x00007f03fc005000 (object 0x0000000749b623a0, a java.lang.Object),
  which is held by Thread 2

Thread 2:
  waiting to lock monitor 0x00007f03fc005100 (object 0x0000000749b623b0, a java.lang.Object),
  which is held by Thread 1

解決方案:

  • 使用 jstack 檢測死鎖。
  • 調(diào)整鎖順序,避免循環(huán)依賴。

3.2 線程池耗盡

示例代碼:

ExecutorService executor = Executors.newFixedThreadPool(2);
for (int i = 0; i < 10; i++) {
    executor.submit(() -> {
        try { Thread.sleep(1000); } catch (InterruptedException e) {}
    });
}

線程轉(zhuǎn)儲(chǔ)表現(xiàn):

"pool-1-thread-1" #12 prio=5 os_prio=0 tid=0x00007f03fc005000 nid=0xa9b06 waiting on condition [0x00007f0438dfc000]
   java.lang.Thread.State: WAITING (parking)

解決方案:

  • 增大線程池大小或使用 ThreadPoolExecutor 動(dòng)態(tài)調(diào)整。
  • 使用有界隊(duì)列避免OOM。

3.3 數(shù)據(jù)庫連接泄漏

Druid 配置優(yōu)化:

spring:
  datasource:
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 1
      test-while-idle: true

監(jiān)控SQL泄漏:

// 在代碼中顯式關(guān)閉連接
try (Connection conn = dataSource.getConnection()) {
    // SQL操作
} // 自動(dòng)關(guān)閉

4. 線程轉(zhuǎn)儲(chǔ)分析工具

VisualVM(可視化分析線程狀態(tài))

FastThread(在線分析工具)

Eclipse MAT(分析線程引用關(guān)系)

5. 總結(jié)

通過分析線程轉(zhuǎn)儲(chǔ),我們可以:

  • 發(fā)現(xiàn)死鎖、線程阻塞等問題。
  • 優(yōu)化線程池和數(shù)據(jù)庫連接池配置。
  • 診斷應(yīng)用崩潰或性能下降的原因。

最佳實(shí)踐:

  • 定期采集線程轉(zhuǎn)儲(chǔ)(尤其在應(yīng)用卡頓時(shí))。
  • 結(jié)合日志和監(jiān)控(如Prometheus + Grafana)全面分析。
  • 使用自動(dòng)化工具(如Arthas)進(jìn)行動(dòng)態(tài)診斷。

到此這篇關(guān)于一文帶你深入解析Java應(yīng)用線程轉(zhuǎn)儲(chǔ)的文章就介紹到這了,更多相關(guān)Java線程轉(zhuǎn)儲(chǔ)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中的@Component注解源碼

    SpringBoot中的@Component注解源碼

    在SpringBoot中,@Component注解用于標(biāo)識(shí)一個(gè)類為Bean,并由Spring進(jìn)行管理,它需要配合@ComponentScan注解使用,后者負(fù)責(zé)掃描包含@Component的類,并進(jìn)行自動(dòng)裝配,本文給大家介紹SpringBoot中的@Component注解源碼,感興趣的朋友一起看看吧
    2024-01-01
  • Java實(shí)戰(zhàn)之晚會(huì)抽獎(jiǎng)系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之晚會(huì)抽獎(jiǎng)系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了如何利用Java語言編寫一個(gè)晚會(huì)抽獎(jiǎng)系統(tǒng),文中采用到的技術(shù)有Jdbc、Servlert、JavaScript、JQuery、Ajax等,感興趣的可以學(xué)習(xí)一下
    2022-03-03
  • Maven Assembly實(shí)戰(zhàn)教程

    Maven Assembly實(shí)戰(zhàn)教程

    MavenAssembly插件用于創(chuàng)建可分發(fā)包,如JAR、ZIP或TAR文件,通過配置pom.xml,可以生成包含所有依賴的JAR文件或自定義格式的歸檔文件,示例展示了如何使用默認(rèn)描述符和自定義描述符創(chuàng)建JAR包,以及在多模塊項(xiàng)目中使用Assembly插件
    2024-12-12
  • Java中Json與List、Map、entity的互相轉(zhuǎn)化

    Java中Json與List、Map、entity的互相轉(zhuǎn)化

    在開發(fā)中,Json轉(zhuǎn)換的場景往往也就是那么幾個(gè),本文主要介紹了Java中Json與List、Map、entity的互相轉(zhuǎn)化,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-07-07
  • Java利用移位運(yùn)算將int型分解成四個(gè)byte型的方法

    Java利用移位運(yùn)算將int型分解成四個(gè)byte型的方法

    今天小編就為大家分享一篇關(guān)于Java利用移位運(yùn)算將int型分解成四個(gè)byte型的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • VerifyCodeServlet(一次性驗(yàn)證碼)

    VerifyCodeServlet(一次性驗(yàn)證碼)

    這篇文章主要介紹了VerifyCodeServlet一次性驗(yàn)證碼的使用方法
    2017-05-05
  • MyBatis中關(guān)于SQL的寫法總結(jié)

    MyBatis中關(guān)于SQL的寫法總結(jié)

    這篇文章主要介紹了MyBatis中關(guān)于SQL的寫法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解獲取Spring MVC中所有RequestMapping以及對(duì)應(yīng)方法和參數(shù)

    詳解獲取Spring MVC中所有RequestMapping以及對(duì)應(yīng)方法和參數(shù)

    本篇文章主要介紹了詳解獲取Spring MVC中所有RequestMapping以及對(duì)應(yīng)方法和參數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Java中的LinkedHashMap源碼分析

    Java中的LinkedHashMap源碼分析

    這篇文章主要介紹了Java中的LinkedHashMap源碼分析,LinkedHashMap是HashMap的子類,所以基本的操作與hashmap類似,不過呢,在插入、刪除、替換key-value對(duì)的時(shí)候,需要的朋友可以參考下
    2023-12-12
  • Spring中的@CrossOrigin注解的使用詳細(xì)解讀

    Spring中的@CrossOrigin注解的使用詳細(xì)解讀

    這篇文章主要介紹了Spring中的@CrossOrigin注解的使用詳細(xì)解讀,跨源資源共享(CORS),是由大多數(shù)瀏覽器實(shí)現(xiàn)的W3C規(guī)范,允許對(duì)跨域請求進(jìn)行靈活授權(quán),用來代替IFRAME或JSONP等非正規(guī)實(shí)現(xiàn)方式,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

昌邑市| 绥滨县| 宜良县| 鹤壁市| 侯马市| 大竹县| 阜宁县| 玉龙| 当雄县| 龙江县| 九寨沟县| 瓮安县| 灵寿县| 徐州市| 兴山县| 华宁县| 恭城| 宁明县| 桦南县| 高台县| 长汀县| 泸州市| 涞水县| 玛曲县| 江山市| 昆山市| 黑龙江省| 镇远县| 紫阳县| 民勤县| 乐都县| 潼关县| 保德县| 明星| 东乡| 米易县| 慈利县| 专栏| 南川市| 庄河市| 山丹县|