1. 程式人生 > >【開發工具】JAVA效能分析:8、超詳細的JProfiler執行緒分析(官方中文版)

【開發工具】JAVA效能分析:8、超詳細的JProfiler執行緒分析(官方中文版)

Thread Profiling——執行緒分析

官方文件http://resources.ej-technologies.com/jprofiler/help/doc/index.html

錯誤地使用執行緒可能會產生許多不同型別的問題。太多活動執行緒可能導致執行緒不足,執行緒可能會相互阻塞並影響應用程式的活躍性或以錯誤的順序獲取鎖定可能導致死鎖。此外,有關執行緒的資訊對於除錯目的很重要。

在JProfiler中,執行緒分析分為兩個檢視部分,“執行緒”部分處理執行緒的生命週期和捕獲執行緒轉儲。“監視器和鎖定”部分提供了分析多個執行緒互動的功能。

一、檢查執行緒——Inspecting threads

執行緒歷史記錄檢視將每個執行緒顯示為時間線中的彩色行,其中顏色表示記錄的執行緒狀態。執行緒按建立時間排序,可以按名稱過濾。記錄監視器事件後,您可以將滑鼠懸停在處於“等待”或“阻止”狀態的執行緒部分,並檢視關聯的堆疊跟蹤以及指向監視歷史記錄檢視的連結。

執行緒監視器檢視中提供了所有執行緒的表格檢視。如果在建立執行緒時CPU記錄處於活動狀態,則JProfiler會儲存建立執行緒的名稱並將其顯示在表中。在底部,顯示了建立執行緒的堆疊跟蹤。出於效能原因,未從JVM請求實際堆疊跟蹤,但使用來自CPU記錄的當前資訊。這意味著堆疊跟蹤將僅顯示滿足呼叫樹集合的過濾器設定的那些類。

如果在概要分析設定中啟用了估計的CPU時間記錄,則會在表中新增“ CPU時間”

列。僅在記錄CPU資料時測量CPU時間。

與大多數偵錯程式一樣,JProfiler也可以進行執行緒轉儲。執行緒轉儲的堆疊跟蹤是JVM提供的完整堆疊跟蹤,不依賴於CPU記錄。當您選擇兩個執行緒轉儲並單擊“ 顯示差異”按鈕時,可以在差異檢視器中比較不同的執行緒轉儲。也可以通過選擇它們並從上下文選單中選擇Show Difference來比較單個執行緒轉儲中的兩個執行緒 。

執行緒轉儲也可以通過“觸發器執行緒轉儲”觸發器操作或通過 API進行

二、分析鎖定情況——Analyzing locking situations

每個Java物件都有一個關聯的監視器,可用於兩個同步操作:一個執行緒可以在監視器上等待,直到另一個執行緒在其上發出通知,或者它可以獲取監視器上的鎖,可能阻塞直到另一個執行緒放棄鎖的所有權。此外,Java還提供了java.util.concurrent.locks

包中的類,用於實現更高階的鎖定策略。該包中的鎖不使用物件的監視器,而是使用不同的本機實現。

JProfiler可以記錄上述兩種機制的鎖定情況。在鎖定情況下,有一個或多個執行緒,監視器或例項java.util.concurrent.locks.Lock以及需要一定時間的等待或阻塞操作。這些鎖定情況在監視器歷史記錄檢視中以表格形式顯示,並在鎖定歷史記錄圖中以可視方式顯示。

鎖定歷史記錄圖集中關注所有相關監視器和執行緒的整個關係集,而不是隔離監視器事件的持續時間。參與鎖定情況的執行緒和監視器被繪製為藍色和灰色矩形,如果它們是死鎖的一部分,則它們被塗成紅色。黑色箭頭表示監視器的所有權,黃色箭頭從等待執行緒延伸到關聯的監視器,而紅色虛線箭頭表示執行緒想要獲取監視器並且當前正在阻塞。如果已記錄CPU資料,則將滑鼠懸停在阻塞或等待箭頭上時,可以使用堆疊跟蹤。這些工具提示包含超連結,可將您帶到監視歷史記錄檢視中的相應行。

表格監視器歷史記錄檢視顯示監視器事件。它們具有顯示為列的持續時間,因此您可以通過對錶進行排序來查詢最重要的事件。對於表格檢視中的任何選定行,您可以使用“ 在圖形中顯示”操作跳轉到圖形

每個monitor事件都有一個關聯的監視器。所述監視器類列顯示其監控器被使用,或“[原監控]”如果沒有Java物件與所述顯示器相關聯的例項的類名。在任何情況下,監視器都有一個唯一的ID顯示在單獨的列中,因此您可以將同一監視器的使用情況與多個事件相關聯。每個監視器事件都有一個正在執行操作的等待執行緒,以及可選的阻塞操作的擁有執行緒。如果可用,它們的堆疊跟蹤將顯示在檢視的下半部分。

如果您對顯示器的例項進一步的問題,將在堆檢視器顯示兩個監視器歷史檢視操作和鎖定歷史圖提供了一個連結到堆Walker和選擇監視器例項作為一個新的物件集。

三、限制感興趣的事件——Limiting the events of interest

分析監視器事件的一個基本問題是應用程式可能以非常高的速率生成監視器事件。這就是為什麼JProfiler具有等待和阻止事件的預設閾值,低於該閾值會立即丟棄事件。這些閾值在檢視設定中定義,並且可以增加以便關注更長的事件。

對於錄製的事件,您可以進一步應用過濾器。監視歷史記錄檢視在檢視頂部提供閾值,事件型別和文字過濾器。鎖定歷史記錄圖允許您選擇感興趣的執行緒或監視器,並僅顯示涉及標記實體的鎖定情況。感興趣的事件在時間線中以不同的顏色顯示,並且有一個輔助導航欄來逐步完成這些事件。如果當前事件不是感興趣的事件,您可以檢視當前事件與下一個任何方向感興趣的事件之間有多少事件。

除了存在所選執行緒或監視器的鎖定情況之外,還顯示了從圖形中移除它的鎖定情況。這是因為每個監視器事件都由兩個這樣的鎖定情況定義,一個是操作開始,另一個是結束。這也意味著一個完全空的圖是一個有效的鎖定情況,表明JVM中沒有更多的鎖。

減少需要注意的事件數量的另一個策略是累積鎖定情況。在鎖定歷史記錄圖表中,底部有一個時間線,顯示所有記錄的事件。單擊並拖動它可選擇一個時間範圍,所有包含事件的資料將顯示在上面的鎖定圖中。在累積圖中,每個箭頭可以包含多個相同型別的事件。在這種情況下,工具提示視窗顯示事件的數量以及所有包含事件的總時間。工具提示視窗中的下拉列表顯示時間戳,並允許您在不同事件之間切換。

四、死鎖檢測——Deadlock detection

無論是否記錄監視器事件,始終顯示當前鎖定圖和當前監視器檢視中的資料。這些檢視顯示當前鎖定情況和正在進行的監視器事件。阻塞操作通常是短暫的,但是如果發生死鎖,兩個檢視都將顯示問題的永久檢視。此外,當前鎖定圖表顯示產生紅色死鎖的執行緒和監視器,因此您可以立即發現此類問題。

五、監控使用情況統計——Monitor usage statistics

要從更高的角度研究阻止和等待操作,監視器統計資訊檢視將根據監視器記錄資料計算報告。您可以按監視器,執行緒名稱或監視器類對監視器事件進行分組,並分析每行的累計計數和持續時間。