多執行緒共享資源需同步存取,Java 提供物件鎖機制(synchronized)。但設計不當導致高鎖爭用:執行緒頻繁嘗試獲取已被持有的鎖而阻塞,嚴重限制擴展性。爭用嚴重程度取決於鎖獲取頻率與持有時間長短。
支援 IBM Java SDK/JRE 5.0+ 所有平台,兩大元件:
JLAtiagent.properties 調整 MBean Server 連線資訊(可選)。java -Dcom.sun.management.config.file=JLAtiagent.properties \
-agentlib:JLAtiagent -cp .;JLAagent.jar YourMainClass
啟動成功 Console 顯示 "JLA client registering MBeanServer"。Agent 即開始記錄鎖統計,即使 GUI 未啟動也能事後分析完整生命週期。
java -jar JLAGui.jar # 可選參數:-Dcom.ibm.jla.port=1972 -Dcom.ibm.jla.hostname=
連線成功顯示初始畫面,點擊 "Create Report" 產生快照報告,包含三面板:Java 監視器、系統監視器、摘要報告。
快速掃描紅/橙高條即鎖定效能熱點。
| 欄位 | 含義 |
|---|---|
| %MISS | 阻塞請求佔總獲取比例 |
| GETS | 成功獲取總數 |
| NONREC | 非遞歸獲取數(含 SLOW) |
| SLOW | 導致阻塞的非遞歸獲取數 |
| REC | 遞歸獲取數(執行緒已持有鎖) |
| TIER2/TIER3 | 三層自旋鎖平台的內部/外部循環迭代數 |
| %UTIL | 鎖持有時間佔總間隔比例(需開啟持有時間統計) |
| AVER_HTM | 平均持有時間(排除遞歸) |
| MONITOR NAME | 監視器名稱(未知顯示 NULL) |
兩執行緒同時存取 JLAsink 同步方法(setter/getter)。報告顯示:9,161 Gets,25% Miss,明顯阻塞降低效能。
改良同步粒度或演算法後:9,370 Gets,0% Miss,執行間隔大幅縮短,吞吐量顯著提升。
團隊規劃推出新工具整合 JLA、EVTK、Dump Analyzer 功能,提供全方位即時 Java 應用分析,目前處於設計階段。
JLA 以極低侵入性提供即時鎖統計視覺化,快速定位同步瓶頸,指導開發者縮短持鎖時間、細化鎖粒度,是多執行緒 Java 應用效能調優的關鍵工具。下一篇將深入 Dump Analyzer 擴展開發。