これらは, JVMTI の機能を実装するために使われているクラス. より具体的に言うと, "JVMTI environment" (JVMTI 環境) を実現するためのクラス.
JVMTI の "JVMTI environment" (JVMTI 環境) を実装するためのクラス.
1つの JvmtiEnv オブジェクトが 1つの JVMTI environment (= JVMTI エージェントが GetEnv() で取得する jvmtiEnv オブジェクト) に対応する (See: here for details).
((cite: hotspot/src/share/vm/prims/jvmtiHpp.xsl))
class JvmtiEnv : public JvmtiEnvBase {
(なお, JVMTI environment には JVMTI connection (JVMTI 接続) 毎の状態を管理する役割と JVMTI 関数へのポインタ(environment pointer)を提供する役割があるが, どちらもこのクラスが担当している. ただし, より正確に言うと JVMTI 接続毎の状態を管理する役割はスーパークラスである JvmtiEnvBase が担当している. また, 一部の状態は JvmtiEnvThreadState クラスや JvmtiThreadState クラスが管理している. (See: here for details))
一般的には, GetEnv() で JVMTI environment を取得した各 JVMTI エージェント内に参照が保持されている.
またそれとは別に, 生成された全ての JvmtiEnv オブジェクトは JvmtiEnvBase クラスの _head_environment フィールドに(線形リスト状になって)格納されている.
JvmtiEnv::create_a_jvmti() というファクトリメソッドが用意されており, その中で(のみ)生成されている. そして, このファクトリメソッドは, 現在は以下のパスで(のみ)呼び出されている (See: here and here for details).
jni_GetEnv() -> JvmtiExport::get_jvmti_interface() -> JvmtiEnv::create_a_jvmti()
JvmtiEnvBase::periodic_clean_up() 内で削除されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている. (See: JvmtiGCMarker)
JvmtiGCMarker::JvmtiGCMarker() -> JvmtiEnvBase::check_for_periodic_clean_up() -> JvmtiEnvBase::periodic_clean_up()
内部には JVMTI の関数と同名のメソッドが定義されている (e.g. JvmtiEnv::Allocate(), JvmtiEnv::SetEventCallbacks(), etc).
JVMTI エージェントが環境ポインタ経由で JVMTI 関数を呼び出すと, これらのメソッドが呼び出される.
(正確には, まず jvmtiEnter.cpp で定義されている jvmti_() 関数 (または jvmtiEnterTrace.cpp で定義されている jvmtiTrace_() 関数) が呼び出され, そこから JvmtiEnv のメソッドが呼び出される (See: here for details)).
このクラスの宣言は hotspot/src/share/vm/prims/jvmtiHpp.xsl から生成される.
See: here for details
JvmtiEnv クラス内で使用される補助クラス(VM_Operationクラス).
JNI function table を指定されたものに書き換える.
(なお, 置き換えを非同期に行うと危険なので, safepoint 停止を利用して安全に置き換えられるように VM_Operation になっている).
((cite: hotspot/src/share/vm/prims/jvmtiEnv.cpp))
// VM operation class to copy jni function table at safepoint.
// More than one java threads or jvmti agents may be reading/
// modifying jni function tables. To reduce the risk of bad
// interaction b/w these threads it is copied at safepoint.
class VM_JNIFunctionTableCopier : public VM_Operation {
JvmtiEnv::SetJNIFunctionTable() 内で(のみ)使用されている (See: here for details).
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.