gpt4 book ai didi

java - 监视 Java 应用程序上的锁争用

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:46:35 24 4
gpt4 key购买 nike

我正在尝试创建一个小基准(在 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 个并发访问同步方法的线程。我无法相信在这样的工作量下,不会发生上下文切换。

我的基准测试有什么问题?

最佳答案

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

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

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

关于java - 监视 Java 应用程序上的锁争用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22749700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com