我有一个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
,b
和c
是本地BigDecimal
变量。MATH_CONTEXT
是public final static
变量,只能在XXX.java 我的问题(回答其中任何一个都会有很大的帮助)
RUNNABLE
状态)?答案 0 :(得分:1)
这是一个死锁或活跃问题的证据(该线程似乎没有取得进展,但它处于
RUNNABLE
状态)?
我对此表示怀疑。由于程序冻结,显然存在问题。但是,我怀疑是否存在涉及您所显示代码的死锁。
这是冻结的可能原因还是我应该在其他地方看看?
我认为这可能是一个红鲱鱼,问题出在其他地方。
解决问题的下一步是什么?
我个人会研究潜在的内存分配和垃圾收集问题。特别是,我会确保该计划不会花费所有时间来收集垃圾,因此无法取得进展。
为此,我将使用内存分析器。
在我使用它时,我还会监视进程的整体CPU和内存使用情况以及页面错误统计信息(以查看是否存在过多的交换)。
答案 1 :(得分:1)
我没有看到解决方案,但我可以描述我将要开始的步骤。
我会尝试附上一个Profiler并检查内存是否在增长,因为系统可能会交换内存以及为什么它似乎挂起,但我没有。
探查器还告诉您,如果线程真的挂起,如果是,它似乎挂起。
对于我使用VisualVM的分析。