【问题标题】:Monitoring lock contention on Java applications监控 Java 应用程序上的锁争用
【发布时间】:2014-03-30 20:51:10
【问题描述】:

我正在尝试创建一个小基准(在 Groovy 中),以显示几个同步方法上的高线程争用。在监视自愿上下文切换时应该会出现高争用,而在 Linux 中,这可以通过“pidstat”来实现。

程序如下:

class Res {

    private int n;

    synchronized public void inc() {
        n++;
        def foo = []
        for (int i = 0; i < 1000; ++i) foo << "hello"
    }

    synchronized public int getN() {
        return n;
    }

}




while (true) {

    Res res = new Res()

    int N = 100000

    for (int i = 0; i < N; ++i) {
        new Thread({ 
            res.inc() 
            if (res.getN() == N) {
                println "ok" 
            }
        }).start()
    }

    while (res.getN() < N) {

    }


    println "========================="

}

但是命令

pidstat -w -I -p 26848 5

在自愿上下文切换列上打印 0。该程序创建了 100000 个并发访问同步方法的线程。我不敢相信在这样的工作量下,没有发生上下文切换。

我的基准有什么问题?

【问题讨论】:

标签: java multithreading jvm locking


【解决方案1】:

您的命令仅显示主线程的统计信息,不计算子 PID。

Hotspot JVM 具有内部同步计数器,但需要一些魔法才能解锁它们:

  1. 运行 jconsole.exe -J-Djconsole.showUnsupported 并连接到您的 JVM。
  2. 从主菜单中选择Connection -> Hotspot MBeans -> Create
  3. MBeans 选项卡上打开 sun.management.HotspotRuntime
  4. 您会在 InternalRuntimeCounters 属性下找到一堆计数器:
    • sun.rt._sync_ContendedLockAttempts
    • sun.rt._sync_Parks
    • sun.rt._sync_Notifications
    • sun.rt._sync_Inflations

【讨论】:

  • 谢谢,反正我发现 pidstat -w -I -t -p 26848 5 (我加了 -t) 显示了与单线程相关的信息。
猜你喜欢
  • 2011-02-28
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多