RFR(S): 8193434: [GRAAL] Graal classes are not loaded with -Xshare:dump
Calvin Cheung
calvin.cheung at oracle.com
Wed Feb 28 01:21:51 UTC 2018
Hi Vladimir,
On 2/27/18, 2:49 PM, Vladimir Kozlov wrote:
> Hi Calvin,
>
> I tried to run your patch with test case from bug and I got next
> warnings about Graal classes:
Thanks for trying the patch and noticing the warnings.
>
> Loading classes to share: done.
> [0.935s][info][cds ] Shared spaces: preloaded 1187 classes
> Rewriting and linking classes ...
> Preload Warning: Verification failed for
> org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode
> Preload Warning: Verification failed for
> org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyWithSlowPathNode
You'll see more info if you enable the following logging:
-Xlog:class+init=info -Xlog:class+load=debug
[3.308s][info ][class,load]
org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode
source: jrt:/jdk.internal.vm.compiler
[3.308s][debug][class,load] klass: 0x00000008c0128f50 super:
0x00000008c0128880 interfaces: 0x00000008c00d50e0 loader: [class loader
0x00007fdff074a460 a
'jdk/internal/loader/ClassLoaders$PlatformClassLoader'{0x000000046425cf68}]
bytes: 2866 checksum: af714378
super: 0x00000008c0128880 is:
[3.305s][info ][class,load]
org.graalvm.compiler.replacements.nodes.BasicArrayCopyNode source:
jrt:/jdk.internal.vm.compiler
[3.305s][debug][class,load] klass: 0x00000008c0128880 super:
0x00000008c00d93a8 interfaces: 0x00000008c00d2948 0x00000008c00d7780
0x00000008c00d6a78 0x00000008c00d50e0 0x00000008c00d8a98 loader: [class
loader 0x00007fdff074a460 a
'jdk/internal/loader/ClassLoaders$PlatformClassLoader'{0x000000046425cf68}]
bytes: 13151 checksum: 922d7ccf
BasicArrayCopyNode failed verification:
[4.189s][info ][class,init] Start class verification for:
org.graalvm.compiler.replacements.nodes.BasicArrayCopyNode
[4.191s][info ][class,init] 1038 Initializing
'java/lang/ClassNotFoundException'(no method) (0x00000008c00043a8)
[4.191s][info ][class,init] 1039 Initializing
'java/lang/NoClassDefFoundError'(no method) (0x00000008c00048c8)
[4.191s][info ][class,init] Verification for
org.graalvm.compiler.replacements.nodes.BasicArrayCopyNode has exception
pending java.lang.NoClassDefFoundError
After some debugging, the NoClassDefFoundError was referring to the
following class:
org/graalvm/compiler/nodes/virtual/VirtualObjectNode
The NoClassDefFoundError was thrown in
SystemDictionary::handle_resolution_exception() at line #221.
It is because the VirtualObjectNode was loaded after the force init of
JVMCI runtime. At that time, the _force_init_jvmci_runtime flag had been
reset to false and so in SystemDictionary::resolve_from_stream(), it
didn't load the class but threw the CNFE.
>
> I see that Graal classes are loaded:
That's good.
>
> [0.717s][info][class,load]
> org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyWithSlowPathNode
> source: jrt:/jdk.internal.vm.compiler
> [0.718s][info][class,load]
> org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode
> source: jrt:/jdk.internal.vm.compiler
>
> Is it because CDS is limited to java.base? With UseAppCDS I don't have
> this problem.
If the UseAppCDS is enabled, it will load classes defined to other class
loaders in additional to the null class loader.
Without the fix, the UseAppCDS can be used as a workaround.
thanks,
Calvin
>
> Thanks,
> vladimri
>
> On 2/27/18 11:01 AM, Calvin Cheung wrote:
>> bug: https://bugs.openjdk.java.net/browse/JDK-8193434
>>
>> webrev: http://cr.openjdk.java.net/~ccheung/8193434/webrev.01/
>>
>> java -Xshare:dump -Xlog:cds,cds+hashtables
>> -XX:+UnlockDiagnosticVMOptions -XX:SharedArchiveFile=./test.jsa
>> -Xbatch -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
>> -XX:+UseJVMCICompiler -Djvmci.Compiler=graal
>>
>> The above command causes the CNFE to be thrown in
>> SystemDictionary::resolve_from_stream() during CDS dump time.
>> The proposed change is to add a _force_init_jvmci_runtime flag which
>> is set at the beginning of JVMCIRuntime::force_initialization() and
>> reset at the end of the initialization. The flag will be checked in
>> SystemDictionary::resolve_from_stream() so that it will not throw
>> CNFE during the eager initialization of JVMCI runtime during vm init.
>>
>> The proposed change passed hs-tier1 through hs-tier3 testing on
>> linux-x64, windows-x64, sparcv9, and Mac OS X.
>>
>> thanks,
>> Calvin
>>
More information about the hotspot-runtime-dev
mailing list