确定最有争议的锁?

时间:2009-09-08 15:24:23

标签: java multithreading

我们的应用程序有~10个线程执行单独的任务(没有线程池)。我们没有遇到死锁,但总是试图降低响应请求的延迟,因此我们有兴趣确定哪些锁是最有争议的。 jconsole显示了线程被阻塞的频率,并且不常见,但我们仍然想知道哪些锁是最有争议的。

我们正在使用Sun JVM运行,因此来自IBM的JLA没用,我们没有在Solaris上运行,所以我们不能使用dTrace。

编辑:我想在制作中进行这种观察,其中探查器会使应用程序变得无法接受。这是一个交易系统,如果我们很慢,我们会亏钱,所以我们不会在生产中运行分析器。在性能测试中模拟我们交谈的许多交换也很困难。

3 个答案:

答案 0 :(得分:7)

获得像YourKit这样的好的分析器。它可以告诉您等待和阻止其中包含的特定方法和对象监视器花费了多少时间。例如:

alt text


关于您对生产指标的评论,您可以收集的内容非常有限。您将获得的最多信息来自ThreadMXBean,它可以为您提供有关所有正在运行的线程的元数据。它不会为您提供有关特定对象监视器争用的信息。

我不想在这里上我的象牙塔,但我真的觉得你最好的办法就是尽可能地复制你的生产环境。花一些时间来实现这一目标将在未来多次支付红利。

即使在模拟但不太好的环境中运行分析器,也可能会为您提供良好的信息。

答案 1 :(得分:5)

特德,我同情你的情况,但是当表现非常重要时,我建议你咬紧牙关并模拟。

它不应该像你担心的那么难:不是试图从交换机生成消息流,为什么不记录传入流并在模拟中重放它?

如果没有这样的话,你总会遇到海森堡问题:影响你正在测量的系统。

答案 2 :(得分:4)

对于数据库中的类似问题,我们在请求之前和获取锁之后立即记录一行。我们也在发布后记录一个。然后我们对这些数据进行后期处理,以生成您正在寻找的统计数据。

编辑:在开发的系统之上,AspectJ可能是生成日志的好选择。