RHEL OpenJDKを使用している場合(または同様のことですが、それはOracleのJDKではないということです)、SystemTapを使用できます。
いくつかのプローブは、javaコマンドラインオプションを使用することによって有効になっています-XX:+DTraceMethodProbes
、-XX:+DTraceAllocProbes
、-XX:+DTraceMonitorProbes
。これらのプローブを有効にすると、プログラムのパフォーマンスに大きな影響を与えることに注意してください。
SystemTapスクリプトの例を次に示します。
#!/usr/bin/stap
probe hotspot.class_loaded {
printf("%12s [???] %s\n", name, class);
}
probe hotspot.method_entry,
hotspot.method_return {
printf("%12s [%3d] %s.%s\n", name, thread_id, class, method);
}
probe hotspot.thread_start,
hotspot.thread_stop {
printf("%12s [%3d] %s\n", name, id, thread_name);
}
probe hotspot.monitor_contended_enter,
hotspot.monitor_contended_exit {
printf("%12s [%3d] %s\n", name, thread_id, class);
}
jstack()
プロセスのJavaスタックを取得するために使用することもできますが、JVMの前に SystemTapを起動した場合にのみ機能します。
SystemTapはすべてのメソッドをトレースすることに注意してください。また、メソッドの引数を取得することもできません。もう1つのオプションは、JVMTIと呼ばれるJVM独自のトレース機能を使用することです。最も有名なJVMTI実装の1つはBTraceです。