代码之家  ›  专栏  ›  技术社区  ›  Phil Harvey

检测潜在死锁的Java byecode操作

  •  2
  • Phil Harvey  · 技术社区  · 12 年前

    我在Java应用程序中遇到了另一个死锁,并开始思考如何在未来检测潜在的死锁。我有一个如何做到这一点的想法,但似乎太简单了。

    我想听听人们对此的看法。

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

    我认为在我们的应用程序上执行字节码操作是可能的,这样,无论何时使用锁(例如,输入同步块),锁的详细信息都会添加到ThreadLocal列表中。

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

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

    4 回复  |  直到 12 年前
        1
  •  4
  •   Thomas Owens    12 年前

    这是我们在学习并发性课程时讨论过的内容。我不确定您的实现是否是原创的,但确定潜在死锁的分析概念并不是唯一的。Java有一些动态分析工具,例如 JCarder some analysis that can be done statically

    诚然,我已经有几年没有四处看看了。我不认为JCarder是我们谈论的具体工具(至少,这个名字听起来不熟悉,但我找不到其他东西)。但问题是,检测死锁的分析并不是一个最初的概念,我会从已经产生可用工具的研究开始——我怀疑算法(如果不是实现的话)是普遍可用的。

        2
  •  3
  •   Gray droiddeveloper    12 年前

    我用做过类似的事情 Lock 通过提供我自己的实现。

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

        3
  •  2
  •   Gray droiddeveloper    12 年前

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

    ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
    long[] deadLockedThreadIds = threadMxBean.findMonitorDeadlockedThreads();
    // log the condition or even interrupt threads if necessary
    ...
    
        4
  •  0
  •   Alexei Kaigorodov    12 年前

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