RFR: 8038468: java/lang/instrument/ParallelTransformerLoader.sh fails with ClassCircularityError
Karen Kinnear
karen.kinnear at oracle.com
Sat Nov 1 12:47:07 UTC 2014
So the loader this code refers to is the loader that is called when we get a CFLH.
Run the test with -XX:+TraceClassLoading and on the error situation - see which
class loader is trying to load URLClassPath$JarLoader$2 - that should be the boot loader,
and that is the value of the "loader" coming in to the TestTransformer for the
situation below.
The way I read this - the boot loader is trying to load URLClassPath$JarLoader$2 in order
to be able to let the URLClassLoader do its findClass, and the agent intercepts that
and tries to call loadClasses, which itself will use the loader in the test case, which puts
us into an infinite loop - except circularity detection catches us.
See if that makes sense with experimentation please.
thanks,
Karen
On Nov 1, 2014, at 5:59 AM, serguei.spitsyn at oracle.com wrote:
> On 10/31/14 4:55 PM, Yumin Qi wrote:
>> Karen,
>>
>> Thanks for your detail message for debugging. Yes, from my debugging, the exception did happen in TestThread other than main thread. I have no idea why in the end the exception was reported in main thread.
>>
>> You mention
>>
>> So that change to the test would be:
>> in TestTransformer:
>> if (loader != null) {
>> if (tName.equals("TestThread")) {
>> {
>> loadClasses(3);
>> }
>> }
>> return null;
>> }
>>
>> The loader is the one defined in the test case, right?
>
> Not sure, I understand your question correctly.
>
> If thread is the TestThread then most likely the answer is "Yes".
> This one is expected:
> sClassLoader = new URLClassLoader(new URL[] {sURL});
>
> The class loading for TestThread has to happen in the loadClasses(2).
> I wonder if we ever observe any other loader for the TestThread.
>
> The question is because the TestThread is pretty simple:
>
> private static class TestThread extends Thread {
> private final int fIndex;
> public TestThread(int index) { <== it is called with index = 2
> super("TestThread");
> fIndex = index;
> }
> public void run() { loadClasses(fIndex); }
> }
>
> Thanks,
> Serguei
>
>
>> The system class loader is never null.
>> I will try this change, let's see if it can work it out.
>>
>> Thanks
>> Yumin
>>
>> On 10/31/2014 3:29 PM, Karen Kinnear wrote:
>>> Yumin,
>>>
>>> From your earlier exception stack trace (many thanks) you reported:
>>>
>>> Exception in thread "main" java.lang.ClassCircularityError: (no - I don't know why this is in thread "main")
>>> sun/misc/URLClassPath$JarLoader$2
>>> at sun.misc.URLClassPath$JarLoader.checkResource(URLClassPath.java:771)
>>> at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:843)
>>> at sun.misc.URLClassPath.getResource(URLClassPath.java:199)
>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:364)
>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
>>> at java.security.AccessController.doPrivileged(Native Method)
>>> at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:426)
>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:359)
>>> at java.lang.Class.forName0(Native Method)
>>> at java.lang.Class.forName(Class.java:340)
>>> at ParallelTransformerLoaderApp.loadClasses(ParallelTransformerLoaderApp.java:83)
>>> at ParallelTransformerLoaderApp.main(ParallelTransformerLoaderApp.java:45)
>>>
>>>
>>> So I ran with -XX:AbortVMOnException=java.lang.ClassCircularityError -XX:+ShowMessageBoxOnError to get
>>> a log file and stack trace. See my instructions below on how to do that.
>>>
>>> I did this, attached a debugger, which didn't help enough since I needed to see the java stack frames,
>>> and got an hs_err_log also, so the stack traces came from the error log.
>>>
>>> The stack trace was on Thread 2, which in the hs_err_log was TestThread (which makes sense for what the test logic says).
>>> See later in email for stack traces from Thread 2.
>>>
>>> Summary of stack trace:
>>>
>>> TestThread:
>>> loadClasses(#) -> forName(TestClass#, URLClassLoader)
>>> vm calls out to URLClassLoader.loadClass(String) which is inherited from java.lang.ClassLoader.loadClass(String)
>>> ... calls java.net.URLClassLoader.findClass(...) which calls
>>> DoPrivileged java.net.URLClassLoader$1.run which calls
>>> sun.misc.URLClassPath.getResource(name, false) which calls
>>> sun.misc.URLClassPath$JarLoader.getResource which calls
>>> sun.misc.URLClassPath$JarLoader.checkResource which tries to call sun.misc.URLClassPath$JarLoader$2
>>> - and then the transformer jumps in with loadClasses(# (which we know is 3) and walks the same logic which tries to load sun.misc.URLClassPath$JarLoader$2 again
>>>
>>> Note that in the placeholder table information that Yumin printed, the circularity error is on sun.misc.URLClassPath$JarLoader$2 with the null == boot loader, which
>>> makes sense -- that is the appropriate defining loader, and therefore the one the CFLH would intercept during the defineClass phase.
>>>
>>> In the sun.misc.URLClassPath.java file, in the class JarLoader, in the method checkResource
>>> ... return new Resource() { ... }
>>> -- I do not know why that generates sun.misc.URLClassPath$JarLoader$1, $2 and $3 at build time or when that was added.
>>> I would guess that is when the bug started happening.
>>>
>>> When I have a successful run, sun.misc.URLClassPath$JarLoader$2 loads before any TestClass1 loads.
>>>
>>> My belief is that the point of the test is to test parallel class loading for URL class loaders.
>>> I don't think the point is to test the bootstrap class loader, nor to test bootstrapping - i.e. running the agent before
>>> we have loaded sufficient classes to allow loading URLClassLoader classes.
>>>
>>> What I suggested to Yumin that he try would be to change the test to NOT intercept boot loader loads, so that sun.misc.URLClassPath$JarLoader$#
>>> can load which will in turn allow classes loaded by a URLClassLoader subclass to load.
>>>
>>> So that change to the test would be:
>>> in TestTransformer:
>>> if (loader != null) {
>>> if (tName.equals("TestThread")) {
>>> {
>>> loadClasses(3);
>>> }
>>> }
>>> return null;
>>> }
>>> // I also suspect with that change, we can remove the sleep loop
>>> Note: there was a printed message which said that the Thread "Signal Dispatcher" has called transform(), which I
>>> ignored, however it is good that we don't call loadClass on that thread - which is part of what the sleep loop does -
>>> but that would be handled by the boot loader screening above
>>>
>>> Alternatively we can preload the URLClassPath classes, but I don't think we want to do that, or
>>> we can have the agent explicitly screen on a variety of jdk bootstrapping classes. But I think the cleaner
>>> solution is to screen on the boot loader.
>>>
>>> Does that make any sense to others?
>>>
>>> thanks,
>>> Karen
>>>
>>> p.s. How to run with hotspot flags (jtreg has a -show:rerun option, but with a shell script in the test, this is more complex, so
>>> the following should be easier):
>>>
>>> So what I did was run the test once for it to pass (not your script, but just once with jtreg) so that it generated
>>> the $DST/work directory.
>>> I then created a rerun.csh script - attached - you can modify for your own $DST directory.
>>> I used it to be able to quickly rerun the test without the jtreg framework and compile time etc. but mostly
>>> to be able to actually add hotspot command-line flags.
>>>
>>>
>>>
>>> p.p.s. details from the error log (let me know if you want me to attach the error log to the bug report)
>>>
>>> note: error log shows last 10 events including:
>>> Event: 0.928 loading class sun/misc/URLClassPath$JarLoader$2
>>> Event: 0.928 loading class TestClass3
>>> Event: 0.929 loading class TestClass3 done
>>> Event: 0.929 loading class java/lang/ClassCircularityError
>>> Event: 0.929 loading class java/lang/ClassCircularityError done
>>>
>>> TestThread
>>>
>>> java frames:
>>>
>>> j sun.misc.URLClassPath$JarLoader.checkResource(Ljava/lang/String;ZLjava/util/jar/JarEntry;)Lsun/misc/Resource;+42
>>> j sun.misc.URLClassPath$JarLoader.getResource(Ljava/lang/String;Z)Lsun/misc/Resource;+54
>>> j sun.misc.URLClassPath.getResource(Ljava/lang/String;Z)Lsun/misc/Resource;+53
>>> j java.net.URLClassLoader$1.run()Ljava/lang/Class;+26
>>> j java.net.URLClassLoader$1.run()Ljava/lang/Object;+1
>>> v ~StubRoutines::call_stub
>>> j java.security.AccessController.doPrivileged(Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;+0
>>> j java.net.URLClassLoader.findClass(Ljava/lang/String;)Ljava/lang/Class;+13
>>> j java.lang.ClassLoader.loadClass(Ljava/lang/String;Z)Ljava/lang/Class;+70
>>> j java.lang.ClassLoader.loadClass(Ljava/lang/String;)Ljava/lang/Class;+3
>>> v ~StubRoutines::call_stub
>>> j java.lang.Class.forName0(Ljava/lang/String;ZLjava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Class;+0
>>> j java.lang.Class.forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;+49
>>> j ParallelTransformerLoaderAgent$TestTransformer.loadClasses(I)V+25
>>> j ParallelTransformerLoaderAgent$TestTransformer.transform(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/Class;Ljava/security/ProtectionDomain;[B)[B+81
>>> j sun.instrument.TransformerManager.transform(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/Class;Ljava/security/ProtectionDomain;[B)[B+50
>>> j sun.instrument.InstrumentationImpl.transform(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/Class;Ljava/security/ProtectionDomain;[BZ)[B+34
>>> v ~StubRoutines::call_stub
>>> j sun.misc.URLClassPath$JarLoader.checkResource(Ljava/lang/String;ZLjava/util/jar/JarEntry;)Lsun/misc/Resource;+42
>>> j sun.misc.URLClassPath$JarLoader.getResource(Ljava/lang/String;Z)Lsun/misc/Resource;+54
>>> j sun.misc.URLClassPath.getResource(Ljava/lang/String;Z)Lsun/misc/Resource;+53
>>> j java.net.URLClassLoader$1.run()Ljava/lang/Class;+26
>>> j java.net.URLClassLoader$1.run()Ljava/lang/Object;+1
>>> v ~StubRoutines::call_stub
>>> j java.security.AccessController.doPrivileged(Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;+0
>>> j java.net.URLClassLoader.findClass(Ljava/lang/String;)Ljava/lang/Class;+13
>>> j java.lang.ClassLoader.loadClass(Ljava/lang/String;Z)Ljava/lang/Class;+70
>>> j java.lang.ClassLoader.loadClass(Ljava/lang/String;)Ljava/lang/Class;+3
>>> v ~StubRoutines::call_stub
>>> j java.lang.Class.forName0(Ljava/lang/String;ZLjava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Class;+0
>>> j java.lang.Class.forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;+49
>>> j ParallelTransformerLoaderApp.loadClasses(I)V+25
>>> j ParallelTransformerLoaderApp$TestThread.run()V+4
>>> v ~StubRoutines::call_stub
>>>
>>>
>>>
>>>
>>> detailed frames:
>>>
>>> V [libjvm.so+0x760f5a] Exceptions::_throw_msg(Thread*, char const*, int, Symbol*, char const*)+0x7c
>>> V [libjvm.so+0xce005c] SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, Thread*)+0x7d8
>>> V [libjvm.so+0xcde9e5] SystemDictionary::resolve_or_null(Symbol*, Handle, Handle, Thread*)+0x26d
>>> V [libjvm.so+0xcde435] SystemDictionary::resolve_or_fail(Symbol*, Handle, Handle, bool, Thread*)+0x39
>>> V [libjvm.so+0x690fbc] ConstantPool::klass_at_impl(constantPoolHandle, int, Thread*)+0x3cc
>>> V [libjvm.so+0x5398cb] ConstantPool::klass_at(int, Thread*)+0x55
>>> V [libjvm.so+0x8b1f3c] InterpreterRuntime::_new(JavaThread*, ConstantPool*, int)+0x14a
>>> j sun.misc.URLClassPath$JarLoader.checkResource(Ljava/lang/String;ZLjava/util/jar/JarEntry;)Lsun/misc/Resource;+42
>>> j sun.misc.URLClassPath$JarLoader.getResource(Ljava/lang/String;Z)Lsun/misc/Resource;+54
>>> j sun.misc.URLClassPath.getResource(Ljava/lang/String;Z)Lsun/misc/Resource;+53
>>> j java.net.URLClassLoader$1.run()Ljava/lang/Class;+26
>>> j java.net.URLClassLoader$1.run()Ljava/lang/Object;+1
>>> v ~StubRoutines::call_stub
>>> V [libjvm.so+0x8c3060] JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x6b2
>>> V [libjvm.so+0xba06bc] os::os_exception_wrapper(void (*)(JavaValue*, methodHandle*, JavaCallArguments*, Thread*), JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x3a
>>> V [libjvm.so+0x8c29a7] JavaCalls::call(JavaValue*, methodHandle, JavaCallArguments*, Thread*)+0x7d
>>> V [libjvm.so+0x972a80] JVM_DoPrivileged+0x63d
>>> j java.security.AccessController.doPrivileged(Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;+0
>>> j java.net.URLClassLoader.findClass(Ljava/lang/String;)Ljava/lang/Class;+13
>>> j java.lang.ClassLoader.loadClass(Ljava/lang/String;Z)Ljava/lang/Class;+70
>>> j java.lang.ClassLoader.loadClass(Ljava/lang/String;)Ljava/lang/Class;+3
>>> v ~StubRoutines::call_stub
>>> V [libjvm.so+0x8c3060] JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x6b2
>>> V [libjvm.so+0xba06bc] os::os_exception_wrapper(void (*)(JavaValue*, methodHandle*, JavaCallArguments*, Thread*), JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x3a
>>> V [libjvm.so+0x8c29a7] JavaCalls::call(JavaValue*, methodHandle, JavaCallArguments*, Thread*)+0x7d
>>> V [libjvm.so+0x8c1ec7] JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*)+0x1cb
>>> V [libjvm.so+0x8c2086] JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Handle, Thread*)+0xb0
>>> V [libjvm.so+0xce2096] SystemDictionary::load_instance_class(Symbol*, Handle, Thread*)+0x4ea
>>> V [libjvm.so+0xce00a8] SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, Thread*)+0x824
>>> V [libjvm.so+0xcde9e5] SystemDictionary::resolve_or_null(Symbol*, Handle, Handle, Thread*)+0x26d
>>> V [libjvm.so+0xcde435] SystemDictionary::resolve_or_fail(Symbol*, Handle, Handle, bool, Thread*)+0x39
>>> V [libjvm.so+0x98c89e] find_class_from_class_loader(JNIEnv_*, Symbol*, unsigned char, Handle, Handle, unsigned char, Thread*)+0x49
>>> V [libjvm.so+0x96f681] JVM_FindClassFromCaller+0x39d
>>> C [libjava.so+0xdfd0] Java_java_lang_Class_forName0+0x130
>>> j java.lang.Class.forName0(Ljava/lang/String;ZLjava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Class;+0
>>> j java.lang.Class.forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;+49
>>> j ParallelTransformerLoaderAgent$TestTransformer.loadClasses(I)V+25
>>> j ParallelTransformerLoaderAgent$TestTransformer.transform(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/Class;Ljava/security/ProtectionDomain;[B)[B+81
>>> j sun.instrument.TransformerManager.transform(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/Class;Ljava/security/ProtectionDomain;[B)[B+50
>>> j sun.instrument.InstrumentationImpl.transform(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/Class;Ljava/security/ProtectionDomain;[BZ)[B+34
>>> v ~StubRoutines::call_stub
>>> V [libjvm.so+0x8c3060] JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x6b2
>>> V [libjvm.so+0xba06bc] os::os_exception_wrapper(void (*)(JavaValue*, methodHandle*, JavaCallArguments*, Thread*), JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x3a
>>> V [libjvm.so+0x8c29a7] JavaCalls::call(JavaValue*, methodHandle, JavaCallArguments*, Thread*)+0x7d
>>> V [libjvm.so+0x911bfb] jni_invoke_nonstatic(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*)+0x3cd
>>> V [libjvm.so+0x916918] jni_CallObjectMethod+0x388
>>> C [libinstrument.so+0x4eb5] transformClassFile+0x1e5
>>> C [libinstrument.so+0x1e06] eventHandlerClassFileLoadHook+0x96
>>> V [libjvm.so+0xa04afa] JvmtiClassFileLoadHookPoster::post_to_env(JvmtiEnv*, bool)+0x1a8
>>> V [libjvm.so+0xa0485e] JvmtiClassFileLoadHookPoster::post_all_envs()+0x8a
>>> V [libjvm.so+0xa047c6] JvmtiClassFileLoadHookPoster::post()+0x18
>>> V [libjvm.so+0x9fb6e1] JvmtiExport::post_class_file_load_hook(Symbol*, Handle, Handle, unsigned char**, unsigned char**, JvmtiCachedClassFileData**)+0x85
>>> V [libjvm.so+0x5cd17d] ClassFileParser::parseClassFile(Symbol*, ClassLoaderData*, Handle, KlassHandle, GrowableArray<Handle>*, TempNewSymbol&, bool, Thread*)+0x2af
>>> V [libjvm.so+0x5dd441] ClassFileParser::parseClassFile(Symbol*, ClassLoaderData*, Handle, TempNewSymbol&, bool, Thread*)+0x95
>>> V [libjvm.so+0x5daf03] ClassLoader::load_classfile(Symbol*, Thread*)+0x2ed
>>> V [libjvm.so+0xce1cc4] SystemDictionary::load_instance_class(Symbol*, Handle, Thread*)+0x118
>>> V [libjvm.so+0xce00a8] SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, Thread*)+0x824
>>> V [libjvm.so+0xcde9e5] SystemDictionary::resolve_or_null(Symbol*, Handle, Handle, Thread*)+0x26d
>>> V [libjvm.so+0xcde435] SystemDictionary::resolve_or_fail(Symbol*, Handle, Handle, bool, Thread*)+0x39
>>> V [libjvm.so+0x690fbc] ConstantPool::klass_at_impl(constantPoolHandle, int, Thread*)+0x3cc
>>> V [libjvm.so+0x5398cb] ConstantPool::klass_at(int, Thread*)+0x55
>>> V [libjvm.so+0x8b1f3c] InterpreterRuntime::_new(JavaThread*, ConstantPool*, int)+0x14a
>>> j sun.misc.URLClassPath$JarLoader.checkResource(Ljava/lang/String;ZLjava/util/jar/JarEntry;)Lsun/misc/Resource;+42
>>> j sun.misc.URLClassPath$JarLoader.getResource(Ljava/lang/String;Z)Lsun/misc/Resource;+54
>>> j sun.misc.URLClassPath.getResource(Ljava/lang/String;Z)Lsun/misc/Resource;+53
>>> j java.net.URLClassLoader$1.run()Ljava/lang/Class;+26
>>> j java.net.URLClassLoader$1.run()Ljava/lang/Object;+1
>>> v ~StubRoutines::call_stub
>>> V [libjvm.so+0x8c3060] JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x6b2
>>> V [libjvm.so+0xba06bc] os::os_exception_wrapper(void (*)(JavaValue*, methodHandle*, JavaCallArguments*, Thread*), JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x3a
>>> V [libjvm.so+0x8c29a7] JavaCalls::call(JavaValue*, methodHandle, JavaCallArguments*, Thread*)+0x7d
>>> V [libjvm.so+0x972a80] JVM_DoPrivileged+0x63d
>>> j java.security.AccessController.doPrivileged(Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;+0
>>> j java.net.URLClassLoader.findClass(Ljava/lang/String;)Ljava/lang/Class;+13
>>> j java.lang.ClassLoader.loadClass(Ljava/lang/String;Z)Ljava/lang/Class;+70
>>> j java.lang.ClassLoader.loadClass(Ljava/lang/String;)Ljava/lang/Class;
>>> v ~StubRoutines::call_stub
>>> V [libjvm.so+0x8c3060] JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x6b2
>>> V [libjvm.so+0xba06bc] os::os_exception_wrapper(void (*)(JavaValue*, methodHandle*, JavaCallArguments*, Thread*), JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x3a
>>> V [libjvm.so+0x8c29a7] JavaCalls::call(JavaValue*, methodHandle, JavaCallArguments*, Thread*)+0x7d
>>> V [libjvm.so+0x8c1ec7] JavaCalls::call_virtual(JavaValue*, KlassHandle, Symbol*, Symbol*, JavaCallArguments*, Thread*)+0x1cb
>>> V [libjvm.so+0x8c2086] JavaCalls::call_virtual(JavaValue*, Handle, KlassHandle, Symbol*, Symbol*, Handle, Thread*)+0xb0
>>> V [libjvm.so+0xce2096] SystemDictionary::load_instance_class(Symbol*, Handle, Thread*)+0x4ea
>>> V [libjvm.so+0xce00a8] SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, Thread*)+0x824
>>> V [libjvm.so+0xcde9e5] SystemDictionary::resolve_or_null(Symbol*, Handle, Handle, Thread*)+0x26d
>>> V [libjvm.so+0xcde435] SystemDictionary::resolve_or_fail(Symbol*, Handle, Handle, bool, Thread*)+0x39
>>> V [libjvm.so+0x98c89e] find_class_from_class_loader(JNIEnv_*, Symbol*, unsigned char, Handle, Handle, unsigned char, Thread*)+0x49
>>> V [libjvm.so+0x96f681] JVM_FindClassFromCaller+0x39d
>>> C [libjava.so+0xdfd0] Java_java_lang_Class_forName0+0x130
>>> j java.lang.Class.forName0(Ljava/lang/String;ZLjava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Class;+0
>>> j java.lang.Class.forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;+49
>>> j ParallelTransformerLoaderApp.loadClasses(I)V+25
>>> ...<more frames>...
>
More information about the jdk9-dev
mailing list