「見える化」でJavaシステムを診断する
メッセージからは、以下の内容がわかります。

マルチスレッドで処理が行われる場合、 1つのオブジェクトに複数のスレッドが
同時にアクセスする可能性が出てきます。
下の図のように、スレッドAがオブジェクトのデータを読み取っている間にスレッドBが
そのデータを書き換えたりなど、意図していない結果になってしまう場合があります。

このようなことが起こらないように、スレッドは排他処理によって制御されているのが
一般的です。
つまり、スレッドAがオブジェクトのデータを読み取っている間、スレッドBからデータの
値を変更できないようにオブジェクトをブロックしておきます。

しかし、上の図のように、排他処理が頻繁に行われた場合、スレッドAとスレッドBが
それぞれオブジェクトをブロックしている
時間が長くなり、スレッドAもスレッドBも
処理が進まない、という状況になることがあります。
ENdoSnipeは、ブロック回数が閾値を超過したことを検出します。


PerformanceDoctorのメッセージからブロックをしているスレッドがわかります。
スタックトレースから問題箇所のソースコードを特定し、修正します。
ENdoSnipeでスレッドブロックを検出したい場合は、以下の通り設定してください。
設定変更は、Javelinの設定ファイル(javelin.properties)または、BottleneckEyeのコントロール画面から
行うことができます。
| No. | プロパティ | 設定値 | 概要 |
| 1 | javelin.thread.monitor | true | スレッドの監視をするかどうかを設定します。 javelin.thread.monitorプロパティがtrueの場合、 ENdoSnipeは、Javaアプリケーションのスレッドの性能問題に関する情報を取得します。 |
| 2 | javelin.thread.monitor.interval | 任意 | スレッドの監視を行う周期を設定します。(単位:ミリ秒) 初期値は1000です。 これは、 javelin.thread.monitorプロパティがtrueの場合に有効です。 |
| 3 | javelin.thread.block.threshold | 任意 | スレッドのブロック回数の閾値を指定します。 |
| 4 | javelin.thread.monitor.depth | 任意 | スレッドブロックを検出した場合に取得するスタックトレースの深さを設定します。初期値は10です。 |