2012-05-23 40 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。