RFR: 8160950 Agent JAR added to app class loader rather than system class loader when running with -Djava.system.class.loader

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Thu Sep 8 07:33:25 UTC 2016


Hi David,

On 9/8/16 00:22, David Holmes wrote:
> Hi Serguei,
>
> On 8/09/2016 5:27 AM, serguei.spitsyn at oracle.com wrote:
>> Please, review the fix for:
>>   https://bugs.openjdk.java.net/browse/JDK-8160950
>>
>> Webrev:
>>
>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2016/jdk/8160950-JLI-WLS.jdk2/ 
>>
>>
>>
>> Summary:
>>   When running a java application with the options
>> `-javaagent:myagent.jar -Djava.system.classloader=MyClassLoader`
>>   then the myagent.jar is added to the application class loader rather
>> than the custom system class loader.
>
> I'm confused, the "system" class loader is the "application" class loader.

Yes, the App class loader is the default (or builtin) system class loader.
The option -Djava.system.classloader=MyClassLoader` makes the custom
class loader MyClassLoader to become the (custom) system class loader.

Thanks,
Serguei

>
> David
> -----
>
>>   The problem was that the libinstrument Agent_OnLoad did not invoke the
>>   custom system class loader method appendToClassPathForInstrumentation.
>>   Instead, it added the agent's jar path into the system property
>> "java.class.path".
>>
>>   The solution is to save the jar file path in the global structure and
>> later use it to
>>   invoke the custom system class loader's method
>> appendToClassPathForInstrumentation.
>>
>>   This breaks a compatibility in the rare case if a custom system class
>> loader
>>   does not define the method appendToClassPathForInstrumentation.
>>   The compatibility risk is low because using a custom system class
>> loader is very rare
>>   (little known feature). In addition, any custom class loader used in
>> environments with
>>   tools that load agents into running VMs already define this method.
>>   In the unlikely event that there is a custom system class loader that
>> does not define this
>>   method, and it is used with a java agent specified on command line,
>> then the error will be
>>   clear as the VM will refuse to start. It is trivially fixed by
>> defining the method.
>>
>>   The previous version of the fix was preliminary reviewed by Alan and
>> Mandy.
>>
>> Testing:
>>   Ran the jtreg java.lang.instrument test and new unit test
>>
>> Thanks,
>>
>> Serguei
>>



More information about the serviceability-dev mailing list