2012-05-23 42 views
3

我有一个swing应用程序,它在一些(随机)时间后冻结。我已5个快照每10秒它冻结后,他们都包含这些完全相同的线路:线程转储分析(AWT-EventQueue可运行但等待条件)

"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状态)?
  • 这是冻结的可能原因还是我应该找别的地方?
  • 解决问题的下一步是什么?
+0

是行171同步(方法或块级别)? –

+0

@ejb_guy no - 围绕该部分代码不进行同步。 – assylias

回答

1

是死锁或活跃的问题这方面的证据(线程似乎没有取得进展,但它是在RUNNABLE状态)?

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

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

我认为这很可能是红鲱鱼,问题在于别处。

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

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

要做到这一点,我会使用内存分析器。

虽然我在这里,但我也会监视进程的整体CPU和内存使用情况以及页面错误统计信息(查看是否存在过度交换)。

1

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

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

分析器还告诉你,如果线程真的悬挂,如果是,它似乎挂起。

用于剖析我使用VisualVM。