内部的には DTraceJSDT クラスによって実現されている (なお, 現状では Solaris 版の実装しかない (See: hotspot/src/os/solaris/vm/dtraceJSDT_solaris.cpp)).
DTraceJSDT::pd_activate() と DTraceJSDT::pd_dispose() が実際のプローブの追加/削除を行う関数. /dev/dtrace/helper というデバイスファイル(古い環境では /devices/pseudo/dtrace@0:helper) に対して ioctl() で DTRACEHIOC_ADDDOF や DTRACEHIOC_REMOVE を指定することで追加/削除を行っている.
Java プログラムから使う場合のエントリポイントは sun.tracing.dtrace.JVM クラス. このクラスのネイティブメソッドが CVMI 経由で DTraceJSDT を呼び出している.
CVMI 関数のルックアップは lookupJvmSymbols() 関数で行われる.
ルックアップ結果は jvm_symbols という大域変数に納められており, sun.tracing.dtrace.JVM クラスのネイティブメソッドからは, この大域変数経由で間接的に CVMI 関数を呼び出している.
((cite: jdk/src/share/native/sun/tracing/dtrace/JVM.c))
static JvmSymbols* jvm_symbols = NULL;
sun.tracing.dtrace.JVM.activate0() -> JVM_DTraceActivate() -> DTraceJSDT::activate() -> RegisteredProbes::RegisteredProbes() -> ... -> AdapterHandlerLibrary::create_dtrace_nmethod() -> DTraceJSDT::pd_activate() -> RegisteredProbes::toOpaqueProbes()
sun.tracing.dtrace.JVM.dispose0() -> JVM_DTraceDispose() -> DTraceJSDT::dispose() -> RegisteredProbes::toRegisteredProbes() -> DTraceJSDT::pd_dispose()
sun.tracing.dtrace.JVM.isEnabled0() -> JVM_DTraceIsProbeEnabled() -> DTraceJSDT::is_probe_enabled() -> NativeInstruction::is_dtrace_trap()
sun.tracing.dtrace.JVM.isSupported0() -> JVM_DTraceIsSupported() -> DTraceJSDT::is_supported() -> DTraceJSDT::pd_is_supported()
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.