亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何獲取Java的線程轉儲

發布時間:2021-01-08 14:44:00 來源:億速云 閱讀:206 作者:Leah 欄目:開發技術

如何獲取Java的線程轉儲?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1. 線程轉儲簡介

線程轉儲(Thread Dump)就是JVM中所有線程狀態信息的一次快照。

線程轉儲一般使用文本格式, 可以將其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自動分析。

Java中的線程模型, 直接使用了操作系統的線程調度模型, 只進行簡單的封裝。

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

線程轉儲展示了各個線程的行為, 對于診斷和排查問題非常有用。

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

2. 使用JDK自帶的工具

我們一般使用JDK自帶的命令行工具來獲取Java應用程序的線程轉儲。 這些工具都在JDK主目錄的bin文件夾下。

所以, 只要配置好 PATH 路徑即可。 如果不會配置, 可以參考:JDK環境準備

2.1 jstack 工具

jstack 是JDK內置的一款命令行工具, 專門用來查看線程狀態, 也可以用來執行線程轉儲。

一般先通過jps或者ps命令找到Java進程對應的pid, 然后在控制臺中通過pid來輸出線程轉儲。 當然, 我們也可以將輸出內容重定向到某個文件中。

使用jstack工具獲取線程轉儲的基本參數格式為:

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

下面請看具體的演示:

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

輸出的內容類似于:

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

對應的參數選項是可選的。 具體含義如下:

  • -F選項, 強制執行線程轉儲; 有時候jstack pid會假死, 則可以加上-F標志

  • -l選項, 會查找堆內存中擁有的同步器以及資源鎖

  • -m選項, 額外打印 native棧幀(C和C++的)

例如, 獲取線程轉儲并將結果輸出到文件:

jstack -F 17264 > /tmp/threaddump.txt

使用jps命令可以獲取本地Java進程的 pid。

2.2 Java Mission Control

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

啟動JMC后, 首先會顯示本地計算機上運行的Java進程列表。 當然也可以通過JMC連接到遠程Java進程。

可以鼠標右鍵單擊對應的進程, 選擇 “Start Flight Recording(開始飛行記錄)” 。 結束之后, “Threads(線程)” 選項卡會顯示“線程轉儲”:

如何獲取Java的線程轉儲

2.3 jvisualvm

jvisualvm 是一款客戶端圖形界面工具, 既簡單又實用, 可用來監控 Java應用程序, 對JVM進行故障排查和性能分析。

也可以用來獲取線程轉儲。 鼠標右鍵單擊Java進程, 選擇“ Thread Dump”選項, 則可以創建線程轉儲, 完成后會在新選項卡中自動打開:

如何獲取Java的線程轉儲

2.4 jcmd

jcmd工具本質上是向目標JVM發送一串命令。 盡管支持很多功能, 但不支持連接遠程JVM - 只能在Java進程的本地機器上使用。

其中一個命令是Thread.print, 用來獲取線程轉儲, 示例用法如下:

jcmd 17264 Thread.print

2.5 jconsole

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

打開jconsole并連接到正在運行的Java進程, 導航到“線程”選項卡, 可以查看每個線程的堆棧跟蹤:

如何獲取Java的線程轉儲

2.6 小結

事實證明, 可以使用JDK中的很多工具來獲取線程轉儲。 讓我們回顧一下, 并總結它們的優缺點:

jstack
jmc
jvisualvm
jcmd
jconsole

3. 使用Linux命令

在企業應用服務器中, 出于安全原因, 可能只安裝了 JRE。 這時候沒法使用這些JDK內置的工具。

但還是有辦法獲取線程轉儲。

3.1 使用kill -3指令

在Unix/Linux之類的系統中, 可以使用kill命令獲取線程轉儲, 底層實現原理, 則是通過系統調用kill()將信號參數發送給進程。 這里需要發送的是-3信號。

一般先通過jps找到JAVA進程對應的pid,kill -3使用示例如下:

kill -3 17264

3.2Ctrl + Break(Windows)

在Windows操作系統的命令行窗口中, 可使用組合鍵Ctrl + Break來獲取線程轉儲。 當然, 需要先導航至啟動Java程序的控制臺窗口, 然后同時按下CTRL鍵和Break鍵。

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

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

這兩個命令都可以將線程轉儲打印到控制臺。

4. 通過編程方式使用ThreadMxBean

JMX技術支持各種各樣的花式操作。 可通過ThreadMxBean來執行線程轉儲。

示例代碼如下:

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();
}

上面代碼做的事情很簡單, 先通過ManagementFactory獲取ThreadMxBean對象。

方法的布爾參數lockedMonitorslockedSynchronizers, 表示是否導出持有的同步器和管程鎖。

看完上述內容,你們掌握如何獲取Java的線程轉儲的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大厂| 昆山市| 临沭县| 福鼎市| 湛江市| 应城市| 黑水县| 泸定县| 中山市| 黄石市| 中阳县| 乐山市| 井冈山市| 新余市| 会宁县| 龙州县| 尉氏县| 雷波县| 乌鲁木齐县| 临朐县| 开江县| 呼图壁县| 克什克腾旗| 山丹县| 洱源县| 定安县| 汉阴县| 海口市| 大邑县| 丰县| 和顺县| 延川县| 佛山市| 涿州市| 本溪| 土默特右旗| 衡水市| 英吉沙县| 九龙坡区| 托克托县| 攀枝花市|