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);

どこ:

  • abおよびcはローカルBigDecimal変数です。
  • MATH_CONTEXT変数でありpublic final static、XXX.java内でのみアクセスされます

私の質問(それらのいずれかに答えることは大きな助けになるでしょう)

  • これはデッドロックまたは活性の問題の証拠ですか(スレッドは進行していないようですが、RUNNABLE状態にあります)?
  • これがフリーズの原因である可能性が高いですか、それとも別の場所を探す必要がありますか?
  • 問題を解決するための次のステップは何でしょうか?
4

2 に答える 2

1

これはデッドロックまたは活性の問題の証拠ですか(スレッドは進行していないようですが、RUNNABLE状態にあります)?

疑わしい。プログラムがフリーズするため、明らかに問題があります。ただし、表示したコードに関連するデッドロックがあるとは思えません。

これがフリーズの原因である可能性が高いですか、それとも別の場所を探す必要がありますか?

これは赤ニシンである可能性が高く、問題は他の場所にあると思います。

問題を解決するための次のステップは何でしょうか?

私は個人的に、潜在的なメモリ割り当てとガベージコレクションの問題を調査します。特に、プログラムがゴミの収集にすべての時間を費やしていないため、進行に失敗していないことを確認します。

これを行うには、メモリプロファイラーを使用します。

その間、プロセスの全体的なCPUとメモリの使用状況、およびページフォールト統計(過度のスワッピングがあるかどうかを確認するため)も監視します。

于 2012-05-23T10:23:13.340 に答える
1

解決策はわかりませんが、最初に行う手順を説明できます。

プロファイラーを接続して、メモリが増大しているかどうかを確認しようとします。システムがメモリを交換する可能性があるため、ハングしているように見えるのですが、そうではありません。

プロファイラーは、スレッドが実際にぶら下がっているかどうか、もしそうなら、どこにぶら下がっているように見えるかも教えてくれます。

プロファイリングには、VisualVMを使用します。

于 2012-05-23T10:23:19.300 に答える