3

我有一个 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);

在哪里:

  • a,bc是局部BigDecimal变量。
  • MATH_CONTEXT是一个public final static变量,只能在 XXX.java 中访问

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

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

2 回答 2

1

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

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

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

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

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

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

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

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

于 2012-05-23T10:23:13.340 回答
1

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

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

分析器还会告诉您,线程是否真的挂起,如果是,它似乎挂在哪里。

对于分析,我使用 VisualVM。

于 2012-05-23T10:23:19.300 回答