On Fri, 14 Apr 2023 22:22:13 GMT, Serguei Spitsyn <sspit...@openjdk.org> wrote:

>> Ok. the terminology here might be confusing. The concept of an agent being 
>> "initialized" is introduced and reported by JFR. For example, here is the 
>> JFR event type definition for a NativeAgent:
>> ``` 
>>   <Event name="NativeAgent" category="Java Virtual Machine, Diagnostics" 
>> label="Native Agent" description="A native programming language agent making 
>> use of the JVMTI interface used by development, profiling and monitoring 
>> tools"
>>     thread="false" startTime="false" period="endChunk" stackTrace="false">
>>     <Field type="string" name="name" label="Name" />
>>     <Field type="string" name="options" label="Options" />
>>     <Field type="boolean" name="dynamic" label="Dynamic" description="If the 
>> library attached to the JVM dynamically during runtime, i.e. not at startup" 
>> />
>>     <Field type="Ticks" name="initializationTime" label="Initialization 
>> Time" description="The time the JVM initialized the agent" />
>>     <Field type="Tickspan" name="initializationDuration" 
>> label="Initialization Duration" description="The duration of executing the 
>> JVMTI VMInit event callback. If no VMInit callback is specified, the 
>> duration is 0. For a dynamically loaded agent, it is the duration of 
>> executing the call to Agent_OnAttach." />
>>     <Field type="string" name="path" label="Path" description="The path of 
>> the library" />
>>   </Event>
>> 
>> As you can see, there are two fields: initializationTime and 
>> IntializationDuration.
>> 
>> We report these to let users understand when an agent was initialized 
>> (VMInit or Agent_OnAttach), together with the duration it took to execute 
>> either. For JavaAgents, it measures the invocation and duration of the 
>> premain or agentmain methods.
>> 
>> "Initialized" does not mean "loaded" (at this point, all agents are loaded), 
>> but rather it means the agent has received a timestamp set as a function of 
>> VMInit. This timestamp and duration are what we will report in JFR as part 
>> of the event.
>> 
>> An "uninitialized" agent is an agent who has not yet been timestamped, as 
>> part of VMInit, for example. Since an agent can create multiple JvmtiEnvs, 
>> the function is called lookup_uninitialized_agent() because we can only have 
>> a single timestamp for an agent, but it can, in turn, have multiple 
>> JvmtiEnvs. When looking up an agent again, using a second JvmtiEnv created 
>> by it, the agent is already "initialized", so no agent is returned.
>> 
>> We cannot have the timestamping logic as part of the call out to 
>> Agent_OnLoad, because that call happens very early during VM bootstrap, so 
>> the Ticks support structures are not yet in place. But, timing the 
>> Agent_OnLoad call would be rather meaningless because the agent cannot do 
>> much except construct a JvmtiEnv and setting capabilities and callbacks.
>> 
>> VMInit is where most of the invocation logic, at least for JavaAgents 
>> happens, so the measurements are placed there.
>
> Thank you for explaining it.
> Could you, please, add small comment explaining that it is for JFR purposes?

Will do. Thank you, Serguei.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/12923#discussion_r1168407443

Reply via email to