Java线程分析:确定线程等待特定锁定和每次等待的持续时间

时间:2010-03-02 10:25:24

标签: java profiling

我有一个使用线程的Java应用程序,它使用多个Lock对象实例来同步对公共资源的访问。

现在作为性能测量的一部分,我想测量每个锁中每个线程花费的时间。到目前为止,我已尝试过NetBeans profiler。

Netbeans分析器向我显示了一个线程的总等待时间,但是不可能知道线程等待的锁定时间。

您建议使用哪种工具进行此类测量?

干杯

1 个答案:

答案 0 :(得分:2)

根据您需要的确切数据,您可以从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();