質問

ある日、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 PMD 。すべてを見つけることはできませんが、それは良い第一歩です。

Coberturaのようなカバレッジツールの使用を考えてください。 これらのコードパスをテストしなかったことがわかります。

sthのテスト。このように非常に面倒になる可能性があるため、品質測定を導入してこれを回避するようにしてください。

とにかく、VisualVMのようなツールを使用すると、すべてのスレッドの概要がわかりやすくなるため、予想外に長時間動作しているスレッドを比較的簡単に特定できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top