監控java執行緒

2021-08-09 13:09:53 字數 1221 閱讀 8333

1)獲取執行程式的程序id, 可以通過jps或者ps 過濾出來。

2)通過top -p pid來檢視該程序總的資源使用情況

3)通過jstack -l pid, 能實時列印出某個時刻所有執行緒的執行堆疊,包括每個執行緒的名字和id,id和名字的對應關係是不會變的。

4)  通過top -h -p pid 來實時看到每個執行緒的cpu使用情況,如果某個執行緒異常的占有很多cpu, 我們很快就可以識別出來。

根據執行緒id定位執行緒

有了上面的工具加上程式的日誌,完全可以定位到每個執行緒的資源使用情況。但是還是會遇到一些問題:

1,如何根據執行緒的名字找到執行緒

這個其實很簡單,在top -h -p裡看到某個執行緒一直占用很多cpu,如id為7593,轉成16進製為0x1da9, 那麼可以在jstack -l 裡通過這個id 找到這個執行緒在幹什麼,如jstack -l輸出:

2,使用了執行緒池,執行緒執行的任務是不停的變換的,導致用top -h -p 看的時候,執行緒的id一直在不停的變

跟上面類似,我們只能抓取某個時刻使用cpu較多的執行緒id, 但是我們再用jstack去掃瞄線程的時候,可能這時候這個執行緒已經被排程去幹別的任務了,所以得再想想變通的辦法。

我們知道執行緒池裡的執行緒可以排程幹不同的任務,但是其id和名字的對應關係還是不會變的,我們抓取到瞬時某個cpu的異常情況後,可以找到這個執行緒的名字,然後再去日誌裡面檢視這個執行緒的所有日誌,就知道這個執行緒最近都幹了些啥,很可能我們抓取了不同時刻3個執行緒出現異常,而這三個執行緒幹的其實是同樣的乙個任務,這樣我們就能鎖定目標了。

案例分享:

1)在監控中,我們發現有兩套相同的環境,負載也差不多,卻發現乙個環境cpu使用200%,而另乙個使用才20%,所以肯定有異常情況。

2)通過top監控到總是有幾個執行緒cpu使用率很高,雖然其id在不停的變,但是執行的任務都是在不斷的重連1臺主機。

3)分析重連主機為什麼消耗這麼多cpu,太浪費了,原來**中使用了nio的無阻塞連線,但是使用了1個迴圈在等待連線完成,上**:

while (!this.channel.finishconnect())

顯然,當網路不可達時,執行緒在這個迴圈裡執行的時間太長了,導致占用了過多的cpu, 我們在while迴圈的末尾,讓其稍微sleep下就可以了,最後達到的效果幾乎和另一套環境一樣,即使存在網路不可達的情況,也基本不消耗cpu, 心情大好!

監控執行緒設計

目的 監控服務中各執行緒的執行狀態,防止因為死鎖或其它原因導致某些執行緒不工作,而導致業務不正常 方法 開啟1個daemon執行緒,用於檢測各執行緒的執行狀態 第1步 業務執行緒啟動時,向daemon執行緒註冊 第2步 每隔1段時間,業務執行緒向daemon執行緒傳送心跳訊息 第3步 daemon執...

多執行緒監控

private delegate sub workhandler byval input1 as string,byval input2 as string,byval input3 as string,byval input4 as string,byval input5 as integer f...

遠端執行緒 hook 監控?

見字如面,我是東北碼農。下面是效果圖,可以記錄執行哪些程式 函式引數 執行時間。你也會發現一些有趣的事,例如有時僅僅開啟乙個目錄,就會觸發git的快取程序。實現功能前,我們需要了解當我們雙擊執行乙個程式時,到底發生了什麼?例如啟動乙個瀏覽器,第一步需要先在桌面找到瀏覽器的圖示。在windows系統中...