2010-03-02 63 views
1

我有一个使用线程的Java应用程序,它使用多个Lock对象实例来同步对公共资源的访问。Java线程分析:确定线程等待特定的锁和每个等待的持续时间

现在作为性能测量的一部分,我想测量每个线程在每个锁中所花费的时间。我已经尝试了迄今为止的NetBeans分析器。

Netbeans分析器显示了一个线程的总等待时间,但不可能知道该线程等待多长时间。

您会推荐哪种工具用于此类测量?

干杯

回答

1

取决于你需要什么样的数据,你可以从你的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(); 
+0

@Neil谢谢回答,我想这是做那么唯一的办法。我想在运行过程之外做到这一点。可能吗?坦率地说,我没有使用新的管理API的经验。如何从另一个JVM执行更多的微调/链接。干杯 – Elister 2010-03-04 04:43:07