JVMTI and instrumentation
Alan.Bateman at oracle.com
Wed Dec 2 13:31:22 UTC 2015
On 02/12/2015 11:39, Michael Rasmussen wrote:
> A further question for JVMTI in this regard:
> ClassFileLoadHook callback seems to not be called before VMInit anymore?
> I know the documentation is vague on this point, only specifying that
> it may be sent in primordial phase; but for previous JDK versions, this
> event is sent for all classes being loaded, even java.lang.Object; where
> as on jdk9, the first class I get event for, is what I'm trying to load
> in my VMInit callback.
This is what we have in JEP 261:
"JVM TI agents can no longer instrument Java code that runs early in the
startup of the run-time environment. The vm start event is not sent
until the module system is initialized, so JVM TI agents that do
load-time instrumentation will not receive ClassFileLoadHook events for
classes loaded during startup and they will also miss some
previously-received CompiledMethodLoad and DynamicCodeGenerated events.
Agents can use the GetLoadedClasses function to get the list of loaded
classes and the GenerateEvents function to generate missed events. (Java
agents will continue to function as before, since they run only during
the live phase.)"
So you won't see CFLH events until the Start phase.
I think this can be re-visited once there is support for "module aware"
agents. The important thing that agents will not be able to load classes
outside the java.base module until the module system has been initialized.
>> The transform method gives you the Class<?> of the class being redefined
>> so you should be able to invoke getModule() on this to get the module.
> Yes, when being redefined; but for the initial load/transformation, this
> argument is null, since the class obviously hasn't been defined yet, but
> the module in which it's being loaded should be (disregarding java.base
> classes being loaded before module system is initialized, since this is
> before premain, thus before you can add a instrumentation transformer).
Fair point, it will be NULL when it's a class load so it would require
CFT to define a new transform method.
Just on steps to update these APIs for modules then we should have an
initial patch soon to help debugger agents. This has wider scope because
it requires updates to JVM TI, JDWP and JDI. We need to work on
instrumentation support too so use-cases, examples, and working with us
to get this right would be great.
More information about the jigsaw-dev