hotspot/src/share/vm/runtime/thread.cpp
// Create agents for -agentlib: -agentpath: and converted -Xrun
// Invokes Agent_OnLoad
// Called very early -- before JavaThreads exist
void Threads::create_vm_init_agents() {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
extern struct JavaVM_ main_vm;
AgentLibrary* agent;
{- -------------------------------------------
(1) (JVMTI の phase の変更)
(ここからが JVMTI_PHASE_ONLOAD)
---------------------------------------- -}
JvmtiExport::enter_onload_phase();
{- -------------------------------------------
(1) 以下の for ループ内で
Arguments::agents() に登録されている全ての AgentLibrary オブジェクトを辿り,
それぞれの Agent_OnLoad() メソッドを呼び出す.
(なお, Agent_OnLoad() メソッドが見つからなかった場合や
Agent_OnLoad() がエラーを返した場合は, vm_exit_during_initialization() で異常終了させる)
---------------------------------------- -}
for (agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
{- -------------------------------------------
(1.1) Agent_OnLoad() メソッドを探す
---------------------------------------- -}
OnLoadEntry_t on_load_entry = lookup_agent_on_load(agent);
{- -------------------------------------------
(1.1) Agent_OnLoad() メソッドが見つかった場合は, それを呼び出す.
(なお, 呼び出しがエラーを返した場合は vm_exit_during_initialization() で異常終了させる)
---------------------------------------- -}
if (on_load_entry != NULL) {
// Invoke the Agent_OnLoad function
jint err = (*on_load_entry)(&main_vm, agent->options(), NULL);
if (err != JNI_OK) {
vm_exit_during_initialization("agent library failed to init", agent->name());
}
{- -------------------------------------------
(1.1) Agent_OnLoad() メソッドが見つからなかった場合は,
vm_exit_during_initialization() で異常終了させる.
---------------------------------------- -}
} else {
vm_exit_during_initialization("Could not find Agent_OnLoad function in the agent library", agent->name());
}
}
{- -------------------------------------------
(1) (JVMTI の phase の変更)
(ここからが JVMTI_PHASE_PRIMORDIAL)
---------------------------------------- -}
JvmtiExport::enter_primordial_phase();
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.