Java Webアプリケーションで無限ループを見つける方法は?
-
28-10-2019 - |
質問
ある日、Java WebアプリケーションのCPU使用率が最大100%になります。 再起動するとインシデントは解決しますが、問題が再発してから数時間後なので問題は解決しません。 新しいバージョンによって無限ループが導入されたのではないかと疑われましたが、コードやサーバーに変更を加えていません。
kill -QUITを使用していくつかのスレッドダンプを作成し、すべてのスレッドの詳細を調べて比較することで、問題を見つけることができました。 すべてのスレッドダンプに1つのスレッド呼び出しスタックが表示されることがわかりました。 分析後、データベースで定期的に更新される一部のデータでfalseになることのないwhileループ条件がありました。
Webアプリケーションのいくつかのスレッドダンプの分析は本当に面倒です。
では、本番環境でこのような問題を見つけるためのより良い方法やツールを知っていますか?
解決
いくつかのクエリの後、 Javaの監視と管理で回答を見つけました。 SE 6プラットフォームアプリケーション:
ループしているスレッドを診断するには、JDKが提供するJTopというツールを使用して、各スレッドが使用しているCPU時間を表示します。
スレッド名を使用すると、kill -QUITを使用してスレッドダンプを作成することにより、の[スレッド]タブでこのスレッドのスタックトレースを見つけることができます。
これで、無限ループの原因となるコードに集中できます。
追記: http:/によると、私自身の質問に答えても問題ないようです。 /blog.stackoverflow.com/2008/07/stack-overflow-private-beta-begins/ : […] 「はい、他の誰よりも早く良い答えを見つけたら、自分の質問に答えてもかまいません。」 […]
追記:sun.comドメインが存在しなくなった場合: JTopはスタンドアロンGUIとして実行できます: ジェネラコディセタグプレ
または、JConsoleプラグインとして実行することもできます: ジェネラコディセタグプレ
他のヒント
問題が発生する前に修正してください。 FindBugs や
Coberturaのようなカバレッジツールの使用を考えてください。 これらのコードパスをテストしなかったことがわかります。
sthのテスト。このように非常に面倒になる可能性があるため、品質測定を導入してこれを回避するようにしてください。
とにかく、VisualVMのようなツールを使用すると、すべてのスレッドの概要がわかりやすくなるため、予想外に長時間動作しているスレッドを比較的簡単に特定できます。