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