本系列的第 2 部分將採用 第 1 部分中的鎖死檢測應用程式,並添加一個方法分析視圖來顯示應用程式的哪些地方花費了大部分的 CPU 週期。
Health Center 是一款適用于 JAVA 的 IBM®監視和診斷工具,是一個免費的低開銷診斷工具和 API,用於監視在 IBM JAVA 虛擬機器 (JVM) 上運行的應用程式。 有關此 API 可以執行的操作的細節,請參閱 第 1 部分。 在本文中,將會採用 第 1 部分中開發的鎖死檢測應用程式,並添加一個方法分析視圖來顯示應用程式的哪些地方花費了大部分的 CPU 週期。
系統要求
Health Center API bundle 至少需要安裝 HTTP://www.aliyun.com/zixun/aggregation/13428.html">Eclipse 3.4 或 Eclipse 4.x。
測試應用程式
在 第 1 部分中,已經測試了生成鎖死條件的應用程式。 在本文中,我們將使用該應用程式的修訂版,該版本包含一些會給 CPU 施加壓力的功能。 請參閱 下載,以獲得相關的原始程式碼。 清單 1 顯示了一個代碼片段示例:
清單 1. 新的 GenerateDeadLock 原始程式碼的代碼片段
private class runSlowMethods extends Thread { public void run() { SlowClassAndMethod1 sCAM1 = new SlowClassAndMethod1(); SlowClassAndMethod2 sCAM2 = new SlowClassAndMethod2(); sCAM1.start(); sCAM2.start(); } private class SlowClassAndMethod1 extends Thread { public void run() { while (true) { slowMethod1(); try { Thread.sleep( 2000); } catch (InterruptedException e) { e.printStackTrace(); } } } private void slowMethod1() { String largeString = new String("a string to add"); for (int i = 0; i < 1000000; i++) { largeString.concat(largeString); } } } private class SlowClassAndMethod2 extends Thread { public void run() { while (true) { slowMethod2(); try { Thread.sl eep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } private void slowMethod2() { HashMap map = new HashMap(); String largeString = new String("another string to add"); for (int i = 0; i < 1000000; i++) { map.put(i, largeString); largeString.concat(largeString); } }
通過與該程式連接的 Health Center 代理啟動該程式。 要使用 JAVA 5 SR10 及更高版本、JAVA 6 SR5 及更高版本和 JAVA 7 並通過代理來啟動該應用程式,請使用以下命令(參見圖 1):
java -Xhealthcenter GenerateDeadlock
圖 1. 啟動應用程式
要使用 JAVA 5 SR9 及其早期版本或者 JAVA 6 SR4 及其早期版本並通過代理來啟動應用程式,請使用:
java -agentlib:healthcenter -Xtrace:output=healthcenter.out GenerateDeadlock