モニタおよび管理 API の使い方
![]() |
![]() |
![]() |
![]() |
このドキュメントでは BEA JRockit Monitoring and Management API (JMAPI) を簡単に紹介します。この API は BEA JRockit JVM をモニタおよび管理する手段を提供します。
このドキュメントは JMAPI の簡単な概要です。このインタフェースの実装方法の基本的な手順を示し、機能の一部を簡単に説明しますが、ドキュメントとして最適なソースは以下の Javadoc です。
http://edocs.bea.com/wljrockit/docs142/jmapi/javadoc/Management API/index.html
JMAPI を実装するには、最初に JVMFactory を使用して JVM の実際のインスタンスの参照を取得する必要があります。
JVMFactory
は JVM のインスタンスを取得する静的メソッドを提供します。これが API の使用の起点となります。JVM
は JVM に関する基本情報を提供します。また、さまざまな情報サブシステムへアクセスするために使用されるインタフェースです。以下のサブシステムがあります。ClassLibrary
- 現在ロードされているクラスとクラスローダをモニタおよび管理する方法を提供します。CompilationSystem
- メソッドとコンストラクタのコンパイル方法をモニタおよび管理する手段を提供します。Machine
- CPU、ネットワーク アダプタ、メモリなど JVM が動作するハードウェアについての情報を提供します。MemorySystem
- ヒープおよびガベージ コレクションのデータを提供します。OperatingSystem
- JVM が動作している OS に関する情報を渡します。ProfilingSystem
- 呼び出しのカウントのような JVM の軽量なプロファイリングを実行する方法を提供します。ThreadSystem
- スレッド スタック ダンプ、スレッドのスナップショット、スレッド数、および BEA JRockit で動作するスレッドへアクセスする手段を提供します。JVM
のインスタンスを取得するには、次のようなコードを追加する必要があります。
com.bea.jvm.JVM myJVM = com.bea.jvm.JVMFactory.getJVM();
JVM
インスタンスから、メモリ システムなどのさまざまなサブシステムにアクセスできます。特に、メモリ システムからはヒープ サイズの情報を要求したり、GarbageCollector
にアクセスしたりできます。現在使用されているヒープ サイズ (バイト単位) の読み込みは次のようになります。
com.bea.jvm.JVM myJVM = com.bea.jvm.JVMFactory.getJVM();
long heapSize = myJVM.getMemorySystem().getUsedHeapSize();
ナーサリと一緒にパラレル ガベージ コレクタを使用しているかどうかを確認するには、次のコード リスト 2 のようなコードを含めます。
com.bea.jvm.GarbageCollector myGC = myJVM.getMemorySystem().getGarbageCollector();
boolean isParallelWithNursery = myGC.isParallel() &&
myGC.isGenerational();
JMAPI を使用して多数のさまざまなイベントをサブスクライブできます。
ClassLoadEvent
- ロードおよびアンロードされたクラスを報告します。CompilationListener
- コンパイルされたメソッドとコンストラクタを報告します。GarbageCollectionEvent
- ガベージ コレクションの後に発生します。コード リスト 3 では、ロードおよびアンロードされたクラスの名前を出力する匿名の ClassLoadListener
を追加する方法を示します。
コード リスト 3 匿名の ClassLoadListener
の追加
JVM myJVM = JVMFactory.getJVM();
myJVM.getClassLibrary().addClassLoadListener(new
ClassLoadListener()
{
public void onClassLoad(ClassLoadEvent event)
{
String prefix = (event.getEventType() ==
ClassLoadEvent.CLASS_LOADED) ? "Loaded" : "Unloaded";
System.out.println(prefix + " : " +
event.getClassObject().getName());
}
});
コード リスト 4 では、コンパイルされたメソッドおよびコンストラクタと、使用された最適化レベルを出力する匿名の CompilationListener
を追加する方法を示します。
コード リスト 4 匿名の CompilationListener
の追加
JVM myJVM = JVMFactory.getJVM();
myJVM.getCompilationSystem().addCompilationListener(
new CompilationListener()
{
public void onMethodCompilation(
CompilationEvent event)
{
String prefix = "Compiled " + (event.hasConstructor() ? " constructor " +
event.getConstructor().getClass().getName() : "method " +
event.getMethod().getClass().getName());
System.out.println(prefix + " : Optimization lvl " +
event.getOptimizationLevel().getDescription());
}
});
BEA JRockit JVM には、メソッドの呼び出し回数やメソッドのタイミング情報を取得するために、非常に効率的でオーバーヘッドの低いプロファイラが用意されています。
コード リスト 6 はサンプル クラス (コード リスト 5 を参照) のメソッドを呼び出して、呼び出された回数とそのメソッドにかかった合計時間を出力する方法を示します。
public class A
{
public boolean check(Object obj)
{
return this.getClass().isInstance(obj);
}
}
ProfilingSystem profiler =
JVMFactory.getJVM().getProfilingSystem();
A a = new A();
Method [] methods = A.class.getDeclaredMethods();
profiler.setInvocationCountEnabled(methods[0], true);
profiler.setTimingEnabled(methods[0], true);
for (int i = 0; i < 100000; i++) a.check(a);
System.out.println("Profiling system: check method invoked " +
m_jrockit.getProfilingSystem().getInvocationCount(methods[0]) + "
times");
System.out.println("Time spent in method " +
m_jrockit.getProfilingSystem().getTiming(methods[0])
+ " ms");
JMAPI は、特定のクラス (必要な場合はその全サブクラス) の例外が送出された回数をカウントする例外カウンタへのアクセスも提供します。コード リスト 7 は、IOException
をカウントする例を示します。
コード リスト 7 JMAPI による IOException
のカウント
profiler.setExceptionCountEnabled(IOException.class,
true, false);
for (int i = 0; i < 10000; i++)
{
try
{
throw new IOException();
}
catch (Exception e)
{
// 意図的に空白を残す
}
}
System.out.println("Profiling system: exception counts = "
+ m_jrockit.getProfilingSystem().
getExceptionCount(IOException.class));
セキュリティ マネージャを備えた BEA JRockit で動作するコードから JMAPI にアクセスするには、まずそのコードにパーミッション com.bea.jvm.ManagementPermission
"createInstance
" を付与する必要があります。コードにパーミッションを付与する方法の詳細については、「Permissions in the Java 2 SDK」を参照してください。
コードにパーミッションが付与されていない場合、JMAPI にアクセスしようとしても SecurityException が送出されます。
コード リスト 8 では、すべてのコードに JMAPI へアクセスするパーミッションを付与する簡単なポリシー文を示します。
コード リスト 8 セキュリティ マネージャを備えたコードからの JMAPI へのアクセス
grant{
// JRockit Management API へのアクセスに必要
permission com.bea.jvm.ManagementPermission "createInstance";
};
![]() |
![]() |
![]() |