线程转储分析(AWT-EventQueue可运行但等待条件)

时间:2012-05-23 10:13:54

标签: java multithreading concurrency thread-dump

我有一个swing应用程序,在一些(随机)时间后冻结。我冻结后每隔10秒拍摄5个线程快照,它们都包含完全相同的行:

"AWT-EventQueue-0" prio=6 tid=0x0000000009949000 nid=0x7bec waiting on condition [0x000000000ebbc000]
  java.lang.Thread.State: RUNNABLE
      at java.math.BigInteger.valueOf(Unknown Source)
      at java.math.BigDecimal.inflate(Unknown Source)
      at java.math.BigDecimal.add(Unknown Source)
      at uk.co.xx.xxx.xxxx.XXX$4.get(XXX.java:171)

请注意,线程转储中没有其他线程在XXX.java中。 相应的代码行(XXX.java:171)看起来有点无害:

a = a.add(b.multiply(c, MATH_CONTEXT), MATH_CONTEXT);

其中:

  • abc是本地BigDecimal变量。
  • MATH_CONTEXTpublic final static变量,只能在XXX.java
  • 中访问

我的问题(回答其中任何一个都会有很大的帮助)

  • 这是一个死锁或活跃问题的证据(该线程似乎没有取得进展,但它处于RUNNABLE状态)?
  • 这是冻结的可能原因还是我应该在其他地方看看?
  • 解决问题的下一步是什么?

2 个答案:

答案 0 :(得分:1)

  

这是一个死锁或活跃问题的证据(该线程似乎没有取得进展,但它处于RUNNABLE状态)?

我对此表示怀疑。由于程序冻结,显然存在问题。但是,我怀疑是否存在涉及您所显示代码的死锁。

  

这是冻结的可能原因还是我应该在其他地方看看?

我认为这可能是一个红鲱鱼,问题出在其他地方。

  

解决问题的下一步是什么?

我个人会研究潜在的内存分配和垃圾收集问题。特别是,我会确保该计划不会花费所有时间来收集垃圾,因此无法取得进展。

为此,我将使用内存分析器。

在我使用它时,我还会监视进程的整体CPU和内存使用情况以及页面错误统计信息(以查看是否存在过多的交换)。

答案 1 :(得分:1)

我没有看到解决方案,但我可以描述我将要开始的步骤。

我会尝试附上一个Profiler并检查内存是否在增长,因为系统可能会交换内存以及为什么它似乎挂起,但我没有。

探查器还告诉您,如果线程真的挂起,如果是,它似乎挂起。

对于我使用VisualVM的分析。