监控 Java 应用程序上的锁争用
Posted
技术标签:
【中文标题】监控 Java 应用程序上的锁争用【英文标题】:Monitoring lock contention on Java applications 【发布时间】: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 个并发访问同步方法的线程。我不敢相信在这样的工作量下,没有发生上下文切换。
我的基准有什么问题?
【问题讨论】:
你可以试试新的Oracle Mission Control。如果您将您的应用程序挂接到flight recorder,您应该会获得有关锁争用的数据。 【参考方案1】:您的命令仅显示主线程的统计信息,不计算子 PID。
Hotspot JVM 具有内部同步计数器,但需要一些魔法才能解锁它们:
-
运行
jconsole.exe -J-Djconsole.showUnsupported
并连接到您的 JVM。
从主菜单中选择Connection -> Hotspot MBeans -> Create。
在 MBeans 选项卡上打开 sun.management.HotspotRuntime。
您会在 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) 显示了与单线程相关的信息。以上是关于监控 Java 应用程序上的锁争用的主要内容,如果未能解决你的问题,请参考以下文章