Java字节码操作以检测潜在的死锁

时间:2012-08-31 12:20:02

标签: java multithreading deadlock

我已经被Java应用程序中的另一个死锁所困,并开始考虑如何在将来发现潜在的死锁。我知道如何做到这一点,但它似乎太简单了。

我希望听到别人的意见。

我打算使用典型的数据集在我们的测试环境中运行我们的应用程序几个小时。

我认为可以在我们的应用程序上执行字节码操作,这样每当它进行锁定(例如输入同步块)时,锁的细节就会被添加到ThreadLocal列表中。

我可以编写一个算法,在稍后的某个时刻,比较所有线程的列表,并检查是否有相反的顺序包含相同的锁对 - 这将被报告为死锁的可能性。同样,我会使用字节码操作将此定期检查添加到我的应用程序中。

所以我的问题是:这个想法(a)原创和(b)可行吗?

4 个答案:

答案 0 :(得分:4)

这是我在参加并发课程时谈到的内容。我不确定您的实现是否是原创的,但确定潜在死锁的分析概念并不是唯一的。 Java有动态分析工具,例如JCarder。还有对some analysis that can be done statically的研究。

不可否认,自从我环顾四周以来已经过了几年。我不认为JCarder是我们谈到的具体工具(至少,这个名字听起来并不熟悉,但我找不到其他的东西)。但重点是,检测死锁的分析并不是一个原始概念,我首先要看一下以可用工具为出发点的研究 - 我会怀疑算法,如果不是实现的话,通常是可用的。

答案 1 :(得分:3)

通过提供我自己的实现,我已经使用Lock做了类似的事情。

这些天我使用actor model,因此几乎不需要锁定数据(因为我几乎没有共享的可变数据)

答案 2 :(得分:2)

如果您不知道,可以使用Java MX bean以编程方式检测死锁线程。这对测试没有帮助,但它可以帮助您至少更好地检测和恢复生产。

ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
long[] deadLockedThreadIds = threadMxBean.findMonitorDeadlockedThreads();
// log the condition or even interrupt threads if necessary
...

答案 3 :(得分:0)

这样你就可以找到一些死锁,但永远不会证明他们缺席。我最好开发静态检查工具,一种字节码分析器,为每个同步方法提供注释。注释应该在资源图中显示带注释的方法的位置。然后任务是在图中找到循环。每个循环都意味着死锁。