JVMTI エージェントのロード処理 (及び Agent_OnLoad()/JVM_Onload() の呼び出し処理) は, HotSpot の起動時(初期化時)に行われる.
なお, -agentlib オプションや -agentpath オプションで指定されたエージェントと, -Xrun オプションで指定されたエージェントは若干扱いが異なる.
-agentlib オプションや -agentpath オプションで指定されたエージェントは, 以下のように処理される.
まず, Arguments::parse_each_vm_init_arg() 関数の中でオプションがパースされる.
(より正確には, そこから呼び出される Arguments::add_init_agent() で処理が行われる)
次に, Threads::create_vm_init_agents() で実際にエージェントがロードされ, それぞれの Agent_OnLoad() 関数が呼び出される.
-Xrun オプションで指定されたエージェントは, 以下のように処理される.
まず, Arguments::parse_each_vm_init_arg() 関数の中でオプションがパースされる.
(より正確には, そこから呼び出される Arguments::add_init_library() で処理が行われる)
なお, JVM_OnLoad() が定義されていなければ -agentlib や -agentpath と同じ形式に変換される. この場合, 残りの処理は -agentlib や -agentpath の場合と同じになる.
JVM_OnLoad() が定義されている場合は, 起動時処理の最後の方で JVM_Onload() の呼び出しが行われる.
-agentlib オプションや -agentpath オプションで指定されたエージェントは Arguments::_agentList フィールドの AgentLibraryList で管理されている.
-Xrun オプションで指定されたエージェントは, JVM_OnLoad() が定義されていれば Arguments::libraryList フィールドの AgentLibraryList で管理されている. 定義されていなければ, 一旦 Arguments::libraryList フィールドに格納された後, Arguments::_agentList フィールドに移される.
http://java.sun.com/developer/technicalArticles/Programming/jvmpitransition/
「JVMPI/JVMDI と JVMTI の両対応のエージェントを作れるように, -Xrun でも Agent_OnLoad() が定義されていれば JVM_OnLoad() を無視して -agentpath と同様に扱い, そうでなければ 1.4 以前と同様に JVM_OnLoad() を呼び出す」 と書かれているが, 若干挙動が違うような...(#TODO)
(なお, Arguments::parse_each_vm_init_arg() は Arguments::parse_vm_init_args() 内の 3箇所で呼び出されている)
(HotSpot の起動時処理) (See: here for details) -> Threads::create_vm() -> (1) 関連するオプション(-Xrun, -agentlib, -agentpath)のパース処理を行う -> Arguments::parse() -> Arguments::parse_vm_init_args() -> Arguments::parse_each_vm_init_arg() -> Arguments::add_init_library() (<= -Xrun オプションの処理) -> AgentLibraryList::add() -> Arguments::add_init_agent() (<= -agentlib オプション及び -agentpath オプションの処理) -> AgentLibraryList::add() -> Arguments::parse_java_options_environment_variable() -> Arguments::parse_options_environment_variable() -> Arguments::parse_each_vm_init_arg() -> (同上) -> Arguments::parse_java_tool_options_environment_variable() -> Arguments::parse_options_environment_variable() -> (同上) (1) -Xrun オプションの値を -agentlib/-agentpath の形式に変換する (ただし JVM_OnLoad() が定義されているものについては変換しない) -> Threads::convert_vm_init_libraries_to_agents() -> Arguments::convert_library_to_agent() -> AgentLibraryList::remove() -> AgentLibraryList::add() (1) エージェントをロードし, それぞれの Agent_OnLoad() 関数を呼び出す -> Threads::create_vm_init_agents() -> lookup_agent_on_load() -> lookup_on_load() -> os::dll_build_name() -> os::dll_load() -> os::dll_lookup() -> それぞれのエージェント(.soファイル等)の Agent_OnLoad() 関数を呼び出す (1) -Xrun オプションで指定されたエージェントで JVM_OnLoad() が定義されているものについて, それぞれの JVM_OnLoad() 関数を呼び出す -> Threads::create_vm_init_libraries()
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction)
(#Under Construction)
(#Under Construction)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.