我们的应用程序有大约10个线程执行不同的任务(没有线程池)。我们没有遇到死锁,但总是试图降低响应请求的延迟,因此我们有兴趣确定哪些锁是最争用的。jconsole显示了线程被阻塞的频率,虽然不是很频繁,但是我们仍然想知道哪些锁是最争用的。
我们使用Sun运行,所以来自IBM的JLA没有什么用处,而且我们没有在Solaris上运行,所以我们不能使用dTrace。
编辑:我想在生产环境中做这个观察,在那里分析器会让应用程序变慢,这是不可接受的。这是一个交易系统,如果我们速度慢,我们就会赔钱,所以我们不会在生产中运行分析器。在性能测试中模拟我们与之交谈的许多交换也是相当困难的。
发布于 2009-09-08 15:31:55
找一个像YourKit这样好的分析器。它可以告诉您在其中包含的特定方法和对象监视器上等待和阻塞所花费的时间。例如:

关于您对生产指标的评论,您可以收集的内容非常有限。您将获得的大多数信息都来自ThreadMXBean,它可以为您提供所有正在运行的线程的元数据。但是,它不会给您提供有关特定对象监视器争用的信息。
我不想在这里进入我的象牙塔,但我真的觉得你最好的选择是尽可能地复制你的生产环境。现在花一些时间来设置它将在未来获得很多倍的收益。
即使在模拟但不够好的环境中运行分析器,也可能会给您提供很好的信息。
发布于 2009-09-08 17:34:35
泰德,我很同情你的情况,但当性能如此关键的时候,我建议你咬紧牙关模拟一下。
它不应该像您担心的那样困难:与其尝试从您的交换中生成消息流,为什么不记录传入的流并在模拟中重放它呢?
如果没有这样的东西,你总是会遇到海森伯格问题:影响你正在测量的系统。
发布于 2009-09-08 15:58:53
对于数据库中的类似问题,我们在请求之前和获取锁之后立即记录一行。我们在发布后也会记录一个。然后,我们对这些数据进行后处理,以生成您正在寻找的统计数据。
编辑:在开发的系统之上,AspectJ可能是生成日志的一个很好的选择。
https://stackoverflow.com/questions/1394631
复制相似问题