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

マルチスレッドで処理が行われる場合、 1つのオブジェクトに複数のスレッドが
同時にアクセスする可能性が出てきます。
下の図のように、スレッド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.blocktime.threshold | 任意 | スレッドのブロック時間の閾値を指定します。(単位:ミリ秒) 指定した時間を超過した場合に、問題として検出します。 初期値は2000です。 これは、javelin.thread.monitorプロパティがtrueの場合に有効です。 |
| 4 | javelin.thread.monitor.depth | 任意 | スレッドブロックを検出した場合に取得するスタックトレースの深さを設定します。初期値は10です。 |