1
我有一個使用線程的Java應用程序,它使用多個Lock對象實例來同步對公共資源的訪問。Java線程分析:確定線程等待特定的鎖和每個等待的持續時間
現在作爲性能測量的一部分,我想測量每個線程在每個鎖中所花費的時間。我已經嘗試了迄今爲止的NetBeans分析器。
Netbeans分析器顯示了一個線程的總等待時間,但不可能知道該線程等待多長時間。
您會推薦哪種工具用於此類測量?
乾杯
我有一個使用線程的Java應用程序,它使用多個Lock對象實例來同步對公共資源的訪問。Java線程分析:確定線程等待特定的鎖和每個等待的持續時間
現在作爲性能測量的一部分,我想測量每個線程在每個鎖中所花費的時間。我已經嘗試了迄今爲止的NetBeans分析器。
Netbeans分析器顯示了一個線程的總等待時間,但不可能知道該線程等待多長時間。
您會推薦哪種工具用於此類測量?
乾杯
取決於你需要什麼樣的數據,你可以從你的Java程序中獲取此信息。例如,類似這樣的事情將每秒鐘持有鎖20次,持續100秒,從而有效地創建鎖>大致時間鎖定的映射(在給定鎖被鎖定期間的「滴答」數量):
private static void runProfile() {
try {
final int noSeconds = 100;
final int sleepMillis = 50;
final int noSamples = noSeconds * 1000/sleepMillis;
ThreadMXBean thb = ManagementFactory.getThreadMXBean();
Map<String,Integer> blockCounts = new HashMap<String, Integer>(50);
for (int i = 0; i < noSamples ; i++) {
long[] ids = thb.getAllThreadIds();
ThreadInfo[] infs = thb.getThreadInfo(ids, 0);
for (ThreadInfo ti : infs) {
LockInfo lockInf = ti.getLockInfo();
if (lockInf != null) {
String key = lockInf.toString();
Integer cnt = blockCounts.get(key);
blockCounts.put(key, cnt == null ? 1 : cnt+1);
}
}
Thread.sleep(sleepMillis);
}
System.out.println("Locks:");
for (String lockName : blockCounts.keySet()) {
System.out.println(lockName + " : " + blockCounts.get(lockName));
}
} catch (InterruptedException iex) {
Thread.currentThread().interrupt();
}
}
適應收集您需要的數據。
然後就可以開始這個會在後臺線程例如爲:
Thread thr = new Thread() {
public void run() {
runProfile();
}
};
thr.setPriority(Thread.MAX_PRIORITY-1);
thr.start();
@Neil謝謝回答,我想這是做那麼唯一的辦法。我想在運行過程之外做到這一點。可能嗎?坦率地說,我沒有使用新的管理API的經驗。如何從另一個JVM執行更多的微調/鏈接。乾杯 – Elister 2010-03-04 04:43:07