診断ガイド

     前  次    目次     
コンテンツの開始位置

ロックのチューニング

Java スレッドのやり取りは、アプリケーションのパフォーマンスに影響を与えます。スレッドのやり取りをチューニングする方法は 2 つあります。

  1. プログラム コードの構造を変更する。たとえば、スレッド間の競合の回数を最小限に抑えます。
  2. アプリケーション実行中の競合の処理方法に影響を与える Oracle JRockit JVM のオプションを使用する。

Oracle JRockit JVM では、Java をコーディングする際にスレッド管理を最適化する方法については言及しませんが、この節では、ロックとロックの競合の処理方法をチューニングするための JRockit JVM のオプションについて説明します。この節では以下の事柄を説明します。

JRockit JVM ハンドルがスレッドとロックを扱う方法については、「スレッドとロックの概要」を参照してください。

 


ロック プロファイリング

JRockit Runtime Analyzer を有効にして、Runtime Analyzer の記録中に発生したロックと競合に関する情報を収集および分析することができます。それには、アプリケーションを起動するときに次のオプションを追加します。

-Djrockit.lockprofiling=true

ロック プロファイリングが有効になっている場合、JRockit Mission Control Client の [プロファイリングのロック] タブで Java ロックに関する情報を表示できます。

注意 : ロック プロファイリングを行うと、Java アプリケーションの実行時に大きなオーバーヘッド処理 (20% 程度) が生じます。

ロック プロファイル カウンタに関連する 2 つの Ctrl-Break ハンドラがあります。使用するには、-Djrockit.lockprofiling オプションを指定してロック プロファイリングを有効にする必要があります。これらのハンドラは jrcmd と一緒に使用します。

ハンドラ lockprofile_print は、ロック プロファイル カウンタの現在の値を出力します。ハンドラ lockprofile_reset は、ロック プロファイル カウンタの現在の値をリセットします。

Ctrl-Break ハンドラと jrcmd の使用の詳細については、「診断コマンドの実行」を参照してください。

 


ファット ロックに対するスピンの無効化

ファット ロックに対するスピンは、通常は効果があります。ただし、ロックによって長い待機時間や競合の頻発が生じる場合など、状況によっては、パフォーマンスの点でコストかかる可能性があります。次のオプションを指定して、ファット ロックに対するスピンを無効にし、パフォーマンス低下の可能性を排除することができます。

-XXdisableFatSpin

このオプションは、Java のファット ロック スピン コードを無効にし、ファット ロックを取得しようとするスレッドが直接スリープ状態に入れるようにします。

 


ファット ロックに対する適応性のあるスピン

スレッドがファット ロックをスピンするか、スピンしない (ロックが取得できない場合に直接スリープ状態に入る) かを JVM に決定させることができます。適応性のあるロック スピンを有効にするには、次のオプションを設定します。

-Djrockit.useAdaptiveFatSpin=true

デフォルトでは、ファット ロックに対する適応性のあるスピンは無効になっています。特定のファット ロックを取得できないスレッドがスピンとスリープのどちらの状態に入るかは、実行時に変更できます。

スレッドがファット ロックのスピンを開始するために満たす必要のある条件を指定できます。次のオプションを使用すると、適応性のあるスピンをチューニングできます。

-Djrockit.adaptiveFatSpinTimeStampDiff=2000000

スピンが有益となる最大差を CPU 固有のチック数単位で設定します。

-Djrockit.adaptiveFatSpinMaxSpin=1000

スレッドがスピン状態からスリープ状態に切り替わるまでに失敗する必要があるスピンの回数です。

-Djrockit.adaptiveFatSpinMaxSleep=1000

スレッドがスピン状態に戻るまでに、早期にロックを取得する必要があるスリープの回数です。

-Djrockit.fatlockspins=100

最も内側のロック スピン コードにおいて、ロックからの読み込みを再試行する前に実行されるループの回数です。

 


ロックの引き下げ

ファットになったロックに対する競合の数が少ない場合、そのロックはシン ロックに戻されます。このプロセスを「ロックの引き下げ」と呼びます。デフォルトでは、ロックの引き下げは有効になっています。ファット ロックを引き下げないようにするには、次のオプションを指定してアプリケーションを実行します。

-XXdisableFatLockDeflation

ロックの引き下げが無効になっている場合、ファット ロックは、競合するスレッドやロックの取得を待機しているスレッドがなくなっても、ファット ロックのままとなります。

ロックの引き下げをトリガするタイミングをチューニングすることもできます。次のオプションで、引き下げるまでに発生する必要のある、競合しなくなったファット ロックの解除の回数を指定します。

-XXfatLockDeflationThreshold=<NumberOfUnlocks>

 


遅延ロック解除

「遅延 (lazy)」ロック解除は、非共有ロックを多用するアプリケーションを対象としています。多数の共有ロックを使用するアプリケーションでは、それらのロックの生存期間が短い場合でも、このオプションを設定するとパフォーマンスの低下を招くことがあるので注意が必要です。

遅延ロック解除が設定されていると、重要なセクションの実行が終了してもその時点ではロックは解放されません。そのため、ロックが一度取得された後で、次にそのようなロックを取得しようとするスレッドは、そのロックがすでに解放されているか、または解放可能であることを確認する必要があります。この確認は、最初のスレッドがその時点でまだロックを使用し続けているかどうかを調べることによって行われます。共有ロックは通常のロックに変換され、遅延モード (lazy モード) の状態は継続しません。

遅延ロック解除は、Java 6 バージョンの Oracle JRockit JVM R27.6 では、IA64 を除くすべてのプラットフォームにおいて、確定的ガベージ コレクタ以外のすべてのガベージ コレクション方式でデフォルトで有効になっています。以前のリリースでは、遅延ロック解除はコマンド ライン オプション -XXlazyUnlocking を使用して有効にできます。


  ページの先頭       前  次