不可解な現象に対するアプローチの実例。具体的だしよくありそうな話なのでとても参考になる。
要約するとこんな感じ。
- システムがレスポンスを返さなくなる現象の原因究明
- jpsコマンドでJavaプロセスの確認(psコマンドでもいい)
- jstackコマンドでスレッドダンプを取得(「kill -3」でもいい)
- とりあえずWARNING状態のコネクションプールが多数あり、開放漏れが原因であろう
- 特にコネクション取得のメソッド「GenericObjectPool.borrowObject」で、つまり開放待ちでとまっている
- (スレッドが停止している付近のみの)ソースを見たけど見つけられなかった
- FindBugsにかけたらクローズ漏れを数箇所特定でき、修正したら少しはましになった。がまだ残ってる
- コネクションプールのリーク検出機能を試したところ、開放漏れを起こしている箇所が判明
- その部分のソースを調査したところ例外時にクローズしていないことがわかり、その部分を修正し問題は解消できた
- フレームワークのDAO機能を利用すると、開発者がクローズを意識しなくてもよくなり開放漏れは無くなるよ
分散開発のABC(前編) コレだけ準備すれば分散開発に失敗しない
バージョン表記に関する豆知識。一度は読んでおきたい。
|
|