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

獲取Java線程轉(zhuǎn)儲(chǔ)的常用方法(推薦)

 更新時(shí)間:2021年01月08日 10:16:24   作者:鐵錨  
這篇文章主要介紹了獲取Java線程轉(zhuǎn)儲(chǔ)的常用方法,本文給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1. 線程轉(zhuǎn)儲(chǔ)簡(jiǎn)介

線程轉(zhuǎn)儲(chǔ)(Thread Dump)就是JVM中所有線程狀態(tài)信息的一次快照。

線程轉(zhuǎn)儲(chǔ)一般使用文本格式, 可以將其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自動(dòng)分析。

Java中的線程模型, 直接使用了操作系統(tǒng)的線程調(diào)度模型, 只進(jìn)行簡(jiǎn)單的封裝。

線程調(diào)用棧, 也稱為方法調(diào)用棧。 比如在程序執(zhí)行過程中, 有一連串的方法調(diào)用鏈:obj1.method2調(diào)用了obj2.methodB,obj2.methodB又調(diào)用了obj3.methodC。 每個(gè)線程的狀態(tài)都可以通過這種調(diào)用棧來表示。

線程轉(zhuǎn)儲(chǔ)展示了各個(gè)線程的行為, 對(duì)于診斷和排查問題非常有用。

下面我們通過具體示例, 來演示各種獲取Java線程轉(zhuǎn)儲(chǔ)的工具, 以及使用方法。

2. 使用JDK自帶的工具

我們一般使用JDK自帶的命令行工具來獲取Java應(yīng)用程序的線程轉(zhuǎn)儲(chǔ)。 這些工具都在JDK主目錄的bin文件夾下。

所以, 只要配置好 PATH 路徑即可。 如果不會(huì)配置, 可以參考:JDK環(huán)境準(zhǔn)備

2.1 jstack 工具

jstack 是JDK內(nèi)置的一款命令行工具, 專門用來查看線程狀態(tài), 也可以用來執(zhí)行線程轉(zhuǎn)儲(chǔ)。

一般先通過jps或者ps命令找到Java進(jìn)程對(duì)應(yīng)的pid, 然后在控制臺(tái)中通過pid來輸出線程轉(zhuǎn)儲(chǔ)。 當(dāng)然, 我們也可以將輸出內(nèi)容重定向到某個(gè)文件中。

使用jstack工具獲取線程轉(zhuǎn)儲(chǔ)的基本參數(shù)格式為:

jstack [-F] [-l] [-m] <pid>

下面請(qǐng)看具體的演示:

# 1. 查看幫助信息
jstack -help

輸出的內(nèi)容類似于:

Usage:
 jstack [-l] <pid>
  (to connect to running process)
 jstack -F [-m] [-l] <pid>
  (to connect to a hung process)
 jstack [-m] [-l] <executable> <core>
  (to connect to a core file)
 jstack [-m] [-l] [server_id@]<remote server IP or hostname>
  (to connect to a remote debug server)

Options:
 -F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
 -m to print both java and native frames (mixed mode)
 -l long listing. Prints additional information about locks
 -h or -help to print this help message

對(duì)應(yīng)的參數(shù)選項(xiàng)是可選的。 具體含義如下:

  • -F選項(xiàng), 強(qiáng)制執(zhí)行線程轉(zhuǎn)儲(chǔ); 有時(shí)候jstack pid會(huì)假死, 則可以加上-F標(biāo)志
  • -l選項(xiàng), 會(huì)查找堆內(nèi)存中擁有的同步器以及資源鎖
  • -m選項(xiàng), 額外打印 native棧幀(C和C++的)

例如, 獲取線程轉(zhuǎn)儲(chǔ)并將結(jié)果輸出到文件:

jstack -F 17264 > /tmp/threaddump.txt

使用jps命令可以獲取本地Java進(jìn)程的 pid。

2.2 Java Mission Control

Java Mission Control(JMC)是一款客戶端圖形界面工具, 用于收集和分析Java應(yīng)用程序的各種數(shù)據(jù)。

啟動(dòng)JMC后, 首先會(huì)顯示本地計(jì)算機(jī)上運(yùn)行的Java進(jìn)程列表。 當(dāng)然也可以通過JMC連接到遠(yuǎn)程Java進(jìn)程。

可以鼠標(biāo)右鍵單擊對(duì)應(yīng)的進(jìn)程, 選擇 “Start Flight Recording(開始飛行記錄)” 。 結(jié)束之后, “Threads(線程)” 選項(xiàng)卡會(huì)顯示“線程轉(zhuǎn)儲(chǔ)”:

2.3 jvisualvm

jvisualvm 是一款客戶端圖形界面工具, 既簡(jiǎn)單又實(shí)用, 可用來監(jiān)控 Java應(yīng)用程序, 對(duì)JVM進(jìn)行故障排查和性能分析。

也可以用來獲取線程轉(zhuǎn)儲(chǔ)。 鼠標(biāo)右鍵單擊Java進(jìn)程, 選擇“ Thread Dump”選項(xiàng), 則可以創(chuàng)建線程轉(zhuǎn)儲(chǔ), 完成后會(huì)在新選項(xiàng)卡中自動(dòng)打開:

2.4 jcmd

jcmd工具本質(zhì)上是向目標(biāo)JVM發(fā)送一串命令。 盡管支持很多功能, 但不支持連接遠(yuǎn)程JVM - 只能在Java進(jìn)程的本地機(jī)器上使用。

其中一個(gè)命令是Thread.print, 用來獲取線程轉(zhuǎn)儲(chǔ), 示例用法如下:

jcmd 17264 Thread.print

2.5 jconsole

jconsole 工具也可以查看線程棧跟蹤。

打開jconsole并連接到正在運(yùn)行的Java進(jìn)程, 導(dǎo)航到“線程”選項(xiàng)卡, 可以查看每個(gè)線程的堆棧跟蹤:

2.6 小結(jié)

事實(shí)證明, 可以使用JDK中的很多工具來獲取線程轉(zhuǎn)儲(chǔ)。 讓我們回顧一下, 并總結(jié)它們的優(yōu)缺點(diǎn):

jstack
jmc
jvisualvm
jcmd
jconsole

3. 使用Linux命令

在企業(yè)應(yīng)用服務(wù)器中, 出于安全原因, 可能只安裝了 JRE。 這時(shí)候沒法使用這些JDK內(nèi)置的工具。

但還是有辦法獲取線程轉(zhuǎn)儲(chǔ)。

3.1 使用kill -3指令

在Unix/Linux之類的系統(tǒng)中, 可以使用kill命令獲取線程轉(zhuǎn)儲(chǔ), 底層實(shí)現(xiàn)原理, 則是通過系統(tǒng)調(diào)用kill()將信號(hào)參數(shù)發(fā)送給進(jìn)程。 這里需要發(fā)送的是-3信號(hào)。

一般先通過jps找到JAVA進(jìn)程對(duì)應(yīng)的pid,kill -3使用示例如下:

kill -3 17264

3.2Ctrl + Break(Windows)

在Windows操作系統(tǒng)的命令行窗口中, 可使用組合鍵Ctrl + Break來獲取線程轉(zhuǎn)儲(chǔ)。 當(dāng)然, 需要先導(dǎo)航至啟動(dòng)Java程序的控制臺(tái)窗口, 然后同時(shí)按下CTRL鍵和Break鍵。

需要注意的是, 某些鍵盤是沒有 “Break” 鍵的。

在這種情況下, 可以組合使用CTRL,SHIFT, 以及Pause鍵。

這兩個(gè)命令都可以將線程轉(zhuǎn)儲(chǔ)打印到控制臺(tái)。

4. 通過編程方式使用ThreadMxBean

JMX技術(shù)支持各種各樣的花式操作。 可通過ThreadMxBean來執(zhí)行線程轉(zhuǎn)儲(chǔ)。

示例代碼如下:

private static String threadDump(boolean lockedMonitors, boolean lockedSynchronizers) {
 
 StringBuffer threadDump = new StringBuffer(System.lineSeparator());
 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
 for(ThreadInfo threadInfo : threadMXBean.dumpAllThreads(lockedMonitors, lockedSynchronizers)) {
 
  threadDump.append(threadInfo.toString());
 }
 return threadDump.toString();
}

上面代碼做的事情很簡(jiǎn)單, 先通過ManagementFactory獲取ThreadMxBean對(duì)象。

方法的布爾參數(shù)lockedMonitorslockedSynchronizers, 表示是否導(dǎo)出持有的同步器和管程鎖。

5. 總結(jié)

我們通過具體示例展示了獲取線程轉(zhuǎn)儲(chǔ)的各種方法。

首先介紹的是各種JDK內(nèi)置工具,

然后討論了命令行方式,

最后介紹了JMX編程的方式。

完整的示例代碼請(qǐng)參考GitHub倉(cāng)庫(kù)。

到此這篇關(guān)于獲取Java線程轉(zhuǎn)儲(chǔ)的常用方法的文章就介紹到這了,更多相關(guān)Java線程轉(zhuǎn)儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC底層執(zhí)行流程及原理解析

    SpringMVC底層執(zhí)行流程及原理解析

    這篇文章主要介紹了SpringMVC底層執(zhí)行流程及原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實(shí)現(xiàn)

    SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Springboot基礎(chǔ)之RedisUtils工具類

    Springboot基礎(chǔ)之RedisUtils工具類

    本文來說下RedisUtils工具類,主要介紹了整合Redis、MyBatis,封裝RedisUtils工具類等知識(shí),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java 利用枚舉實(shí)現(xiàn)接口進(jìn)行統(tǒng)一管理

    Java 利用枚舉實(shí)現(xiàn)接口進(jìn)行統(tǒng)一管理

    這篇文章主要介紹了Java 利用枚舉實(shí)現(xiàn)接口進(jìn)行統(tǒng)一管理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 常見的java面試題

    常見的java面試題

    這篇文章主要為大家詳細(xì)介紹了常見的java面試題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • springMVC引入Validation的具體步驟詳解

    springMVC引入Validation的具體步驟詳解

    本文簡(jiǎn)單介紹如何引入validation的步驟,如何通過自定義validation減少代碼量,提高生產(chǎn)力,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-05-05
  • Java之jdbc連接mysql數(shù)據(jù)庫(kù)的方法步驟詳解

    Java之jdbc連接mysql數(shù)據(jù)庫(kù)的方法步驟詳解

    這篇文章主要介紹了Java之jdbc連接mysql數(shù)據(jù)庫(kù)的方法步驟詳解,JCBC技術(shù)是java開發(fā)必備的只是,jdbc連接mysql數(shù)據(jù)庫(kù),這是一個(gè)比較簡(jiǎn)單的方法,有興趣的可以了解一下
    2020-07-07
  • 詳解Java中的增強(qiáng) for 循環(huán) foreach

    詳解Java中的增強(qiáng) for 循環(huán) foreach

    foreach 是 Java 中的一種語法糖,幾乎每一種語言都有一些這樣的語法糖來方便程序員進(jìn)行開發(fā),編譯期間以特定的字節(jié)碼或特定的方式來對(duì)這些語法進(jìn)行處理。能夠提高性能,并減少代碼出錯(cuò)的幾率。
    2017-05-05
  • kafka生產(chǎn)實(shí)踐(詳解)

    kafka生產(chǎn)實(shí)踐(詳解)

    下面小編就為大家?guī)硪黄猭afka生產(chǎn)實(shí)踐(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • java清除html轉(zhuǎn)義字符

    java清除html轉(zhuǎn)義字符

    這篇文章主要介紹了一個(gè)靜態(tài)文件處理的一些便捷服務(wù),包括 java清除html轉(zhuǎn)義字符,清除html代碼,從style樣式中讀取CSS的屬性,將字符串截取指定長(zhǎng)度,涉及l(fā)og4j,common-lang類的學(xué)習(xí)
    2014-01-01

最新評(píng)論

贵德县| 庆安县| 罗平县| 石阡县| 乌兰察布市| 海口市| 什邡市| 漳浦县| 柳河县| 万全县| 凭祥市| 通山县| 当涂县| 呼图壁县| 叙永县| 滨州市| 亳州市| 昌都县| 玉环县| 沙坪坝区| 扎兰屯市| 营山县| 咸阳市| 鄂州市| 阜南县| 兴业县| 克什克腾旗| 万安县| 松潘县| 临漳县| 周口市| 鄯善县| 江达县| 衡阳市| 贡嘎县| 江安县| 大余县| 龙江县| 防城港市| 钟山县| 浠水县|