Java中怎么利用jstack分析線程狀態(tài)

本篇文章給大家分享的是有關(guān)Java中怎么利用 jstack分析線程狀態(tài),小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、偏關(guān)網(wǎng)絡(luò)推廣、成都小程序開(kāi)發(fā)、偏關(guān)網(wǎng)絡(luò)營(yíng)銷、偏關(guān)企業(yè)策劃、偏關(guān)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供偏關(guān)建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:muchs.cn

jstck 是什么? 這個(gè)是 Oracle JDK 默認(rèn)包含的一個(gè)用于打印執(zhí)行 Java 進(jìn)程的當(dāng)前線程棧信息的工具。官方是這樣介紹的:

jstack prints Java stack traces of Java threads for a given Java process or core file or a remote debug server. For each Java frame, the full class name, method name, 'bci' (byte code index) and line number, if available, are printed.

注意其中幾個(gè)關(guān)鍵點(diǎn):每一個(gè) Java Frame 的全類名,方法名,如果能拿到行號(hào)的話還會(huì)顯示行號(hào)??催^(guò)前面介紹調(diào)試技巧那篇文章(80%的程序員都不了解的調(diào)試技巧)的朋友可能還記得,其中有一個(gè)功能是Drop Frame, 來(lái)實(shí)現(xiàn)后退執(zhí)行。和這里的是一個(gè)地方,都對(duì)應(yīng)線程中的一級(jí)調(diào)用。

使用 jstack 打出來(lái)的信息,和一般應(yīng)用遇到異常時(shí)的 printStackTrace基本一樣,只是那只是一個(gè)線程調(diào)用鏈的,這里通過(guò)工具,可以把應(yīng)用內(nèi)所有線程都打出來(lái)。

用法

使用方式和一般的 Java 分析工具類似,都是通過(guò)

 命令名  <可選參數(shù)> + pid(進(jìn)程id)

這種格式使用。比如對(duì)于 jstack, 一般可以直接 jstack 應(yīng)用pid 即可。這里 pid 可以通過(guò)Java的 jps 工具獲取,也可以通過(guò) Linux 下的ps 工具和 Windows 下的任務(wù)管理器獲取。

輸出

我們以一個(gè)Tomcat進(jìn)程為例,輸出類似這樣:

Java中怎么利用 jstack分析線程狀態(tài)

我們看上面的幾個(gè)框:

最上方左側(cè),是當(dāng)前線程的線程名稱,可以根據(jù)此來(lái)在應(yīng)用內(nèi)大量的線程中找到我們關(guān)心的線程正在執(zhí)行的操作。例如 Tomcat 一般 http-port -x 這種線程是請(qǐng)求的處理線程,頁(yè)面響應(yīng)慢的時(shí)候,可以直接找這一類線程。

隨著請(qǐng)求的增多,線程數(shù)也會(huì)很多。所以一般多線程應(yīng)用開(kāi)發(fā),一個(gè)好的實(shí)戰(zhàn)建議是為創(chuàng)建的線程起一個(gè)有意義的名字,否則打出來(lái)的 stack 里大量的 thread -1, thread -2 這種,天曉得哪一個(gè)才是你的。

第二行的框內(nèi)內(nèi)容,表示當(dāng)前線程的執(zhí)行狀態(tài),是運(yùn)行狀態(tài)還是TIME_WAITING,還是等待鎖等,可以根據(jù)線程狀態(tài)來(lái)了解。

第三個(gè)大框中的內(nèi)容就和我們異常時(shí)輸出的 stackTrace 一樣,是當(dāng)前代碼的調(diào)用鏈。

第四個(gè)框中的內(nèi)容,是當(dāng)前線程掛的鎖的情況。

上面的截圖,是沒(méi)有鎖互相占用的情況下的輸出。如果一個(gè)多線程中有鎖等待時(shí),會(huì)有類似這樣的輸出:

Java中怎么利用 jstack分析線程狀態(tài)

注意,此時(shí)線程狀態(tài)變成了 BLOCKED, 同時(shí),在線程的調(diào)用鏈中,有一個(gè)waiting to lock 的輸出, 同時(shí),在下方持胡鎖的線程中,會(huì)有一個(gè) lock xxx,這個(gè)是當(dāng)前鎖對(duì)象,通過(guò)這個(gè)就可以看出當(dāng)前還有哪些線程在等待同一個(gè)鎖。

所以回到前面的問(wèn)題,如果此時(shí)因?yàn)殒i占用導(dǎo)致的,可以從輸出中看到,同時(shí)如果是數(shù)據(jù)庫(kù)連接池滿了,線程就會(huì)停在數(shù)據(jù)庫(kù)連接的操作上,在 stackTrace 中一眼就能看的出來(lái),甚至網(wǎng)絡(luò) Socket 讀取之類的在等待,都會(huì)在調(diào)用鏈中體現(xiàn)出來(lái),從而可以快速的定位問(wèn)題,解決問(wèn)題。

以上就是Java中怎么利用 jstack分析線程狀態(tài),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文名稱:Java中怎么利用jstack分析線程狀態(tài)
網(wǎng)頁(yè)路徑:http://muchs.cn/article8/ijcoip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站小程序開(kāi)發(fā)、云服務(wù)器、定制開(kāi)發(fā)品牌網(wǎng)站制作、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化