これらは, JVMTI の機能を実装するために使われているクラス. より具体的に言うと, "JVMTI environment" (JVMTI 環境) を実現するためのクラス.
JVMTI の "JVMTI environment" (JVMTI 環境) を実装するためのクラス.
このクラスは JVMTI connection (JVMTI 接続) 毎の状態の管理を行う. JVMTI 接続毎の状態の管理は, このクラスだけでなく, JvmtiEnvBase クラスや JvmtiThreadState クラスと連携して行われている. このクラスはその中で「JVMTI environment 毎に固有でかつスレッド毎に固有」な状態の管理を担当している (See: here for details).
主に以下の情報を格納している.
JVMTI の NotifyFramePop() 関数で指定されたフレーム番号 (See: here for details)
現在の実行地点(実行しているメソッド, および bci(bytecode index))
(この情報はブレークポイントイベントやシングルステップイベントの通知に使われる)
JVMTI の SetThreadLocalStorage() でセットされたスレッド固有なデータ (See: here for details)
現在有効化されているイベント通知の種別
(正確には, その中で SetEventNotificationMode() 時に対象スレッドが指定されていたもの (See: JvmtiEnvThreadEventEnable) (See: here for details))
((cite: hotspot/src/share/vm/prims/jvmtiEnvThreadState.hpp))
///////////////////////////////////////////////////////////////
//
// class JvmtiEnvThreadState
//
// 2. Cache of pending frame_pop_events, created by NotifyFramePop
// and lazily initialized.
// 3: Location of last executed instruction, used to filter out duplicate
// events due to instruction rewriting.
class JvmtiEnvThreadState : public CHeapObj {
各 JvmtiThreadState オブジェクトの _head_env_thread_state フィールドに(のみ)格納されている.
(正確には, このフィールドは JvmtiEnvThreadState の線形リストを格納するフィールド. JvmtiEnvThreadState オブジェクトは _next フィールドで次の JvmtiEnvThreadState オブジェクトを指せる構造になっている. その JvmtiThreadState オブジェクト内で生成した JvmtiEnvThreadState オブジェクトは全てこのフィールドの線形リストに格納されている)
JvmtiThreadState::add_env() 内で(のみ)生成されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
JvmtiThreadState::JvmtiThreadState() -> JvmtiThreadState::add_env() JvmtiEnv::JvmtiEnv() -> JvmtiEnvBase::JvmtiEnvBase() -> JvmtiEventController::env_initialize() -> JvmtiEventControllerPrivate::env_initialize() -> JvmtiThreadState::add_env()
JvmtiThreadState::periodic_clean_up() 内で削除されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている. (See: JvmtiGCMarker)
JvmtiGCMarker::JvmtiGCMarker() -> JvmtiEnvBase::check_for_periodic_clean_up() -> JvmtiEnvBase::periodic_clean_up() -> JvmtiThreadState::periodic_clean_up()
SetThreadLocalStorage() でセットされたデータは以下のフィールドに格納される. (See: here for details)
((cite: hotspot/src/share/vm/prims/jvmtiEnvThreadState.hpp))
void *_agent_thread_local_storage_data; // per env and per thread agent allocated data.
See: here for details
JvmtiEnvThreadState クラス内で使用される補助クラス (なお, コメントでは "Used by : JvmtiThreadState" となっているが typo だと思われる).
JVMTI の NotifyFramePop() で予約された frame を記録しておくためのクラス (See: here for details).
((cite: hotspot/src/share/vm/prims/jvmtiEnvThreadState.hpp))
///////////////////////////////////////////////////////////////
//
// class JvmtiFramePops
// Used by : JvmtiThreadState
// Used by JVMTI methods: none directly.
//
// A collection of JvmtiFramePop.
// It records what frames on a threads stack should post frame_pop events when they're exited.
//
class JvmtiFramePops : public CHeapObj {
各 JvmtiEnvThreadState オブジェクトの _frame_pops フィールドに(のみ)格納されている.
(ただし, オブジェクトの生成は実際に必要になるまで遅延されている)
((cite: hotspot/src/share/vm/prims/jvmtiEnvThreadState.hpp))
// Class used to store pending framepops.
// lazily initialized by get_frame_pops();
JvmtiFramePops *_frame_pops;
JvmtiEnvThreadState::get_frame_pops() 内で(のみ)生成されている (= 初めて使用される時まで生成が遅延されている).
そして, この関数は現在は以下のパスで(のみ)呼び出されている.
JvmtiEnvThreadState::is_frame_pop() -> JvmtiEnvThreadState::get_frame_pops() JvmtiEventControllerPrivate::set_frame_pop() -> JvmtiEnvThreadState::get_frame_pops() JvmtiEventControllerPrivate::clear_frame_pop() -> JvmtiEnvThreadState::get_frame_pops() JvmtiEventControllerPrivate::clear_to_frame_pop() -> JvmtiEnvThreadState::get_frame_pops()
定義されているフィールドは以下の1つのみ
(この GrowableArray
((cite: hotspot/src/share/vm/prims/jvmtiEnvThreadState.hpp))
GrowableArray<int>* _pops;
See: here for details
JVMTI の関数 (より具体的に言うと, NotifyFramePop() 関数) を実装するためのクラス (See: here for details).
JvmtiFramePops と他のクラスの間で 「NotifyFramePop() で予約された frame 番号」の情報をやりとりする際に使われる ValueObj クラス (See: JvmtiFramePops).
(なおコメントによると, 多少問題があるので rewrite したい, とのこと)
((cite: hotspot/src/share/vm/prims/jvmtiEnvThreadState.hpp))
///////////////////////////////////////////////////////////////
//
// class JvmtiFramePop
// Used by : JvmtiFramePops
// Used by JVMTI methods: none directly.
//
// Wrapper class for FramePop, used in the JvmtiFramePops class.
//
// Two problems: 1) this isn't being used as a ValueObj class, in
// several places there are constructors for it. 2) It seems like
// overkill as a means to get an assert and name the geater than
// operator. I'm trying to to rewrite everything.
class JvmtiFramePop VALUE_OBJ_CLASS_SPEC {
定義されているフィールドは以下の1つのみ (このフィールドが frame の番号を示す. 最も古い frame が 0 で新しくなる毎に 1つずつ増えていく.)
((cite: hotspot/src/share/vm/prims/jvmtiEnvThreadState.hpp))
private:
// Frame number counting from BOTTOM (oldest) frame;
// bottom frame == #0
int _frame_number;
See: here for details
JvmtiEnvThreadState クラス内で使用される補助クラス(VM_Operationクラス).
コンストラクタで指定されたスレッドの現在の実行地点 (実行しているメソッド, および bci (bytecode index))を取得する (これらの情報は stack が walkable でないと取得しにくいので VM_Operation になっている).
((cite: hotspot/src/share/vm/prims/jvmtiEnvThreadState.cpp))
class VM_GetCurrentLocation : public VM_Operation {
JvmtiEnvThreadState::reset_current_location() 内で(のみ)使用されている.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.