RFR: 8263399: CDS should archive only classes allowed by module system [v2]
Ioi Lam
iklam at openjdk.java.net
Thu Mar 11 20:20:34 UTC 2021
On Thu, 11 Mar 2021 02:31:32 GMT, Calvin Cheung <ccheung at openjdk.org> wrote:
>> Ioi Lam has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains three additional commits since the last revision:
>>
>> - improved comments per @calvinccheung review
>> - Merge branch 'master' of https://github.com/openjdk/jdk into 8263399-archive-only-classes-allowed-by-modules
>> - 8263399: CDS should archive only classes allowed by module system
>
> src/hotspot/share/memory/metaspaceShared.cpp line 703:
>
>> 701: // print a warning only when the pending exception is class not found
>> 702: log_warning(cds)("Preload Warning: Cannot find %s", parser.current_class_name());
>> 703: }
>
> It seems the other code path which would print the "Preload Warning: Cannot find..." message is as follows:
> ClassLoaderExt::load_class(Symbol *, const char *, Thread *) : InstanceKlass *
> ClassListParser::load_class_from_source(Symbol *, Thread *) : InstanceKlass *
> ClassListParser::load_current_class(Thread *) : Klass *
> MetaspaceShared::preload_classes(const char *, Thread *) : int
> MetaspaceShared::preload_and_dump(Thread *) : void (2 matches)
> which is for custom class loaders and your change in classListParser.cpp did not touch.
>
> Anyway, if the added condition is necessary, the comment should be adjusted to mention the condition.
Hi Calvin, thanks for checking this. I traced the code and found out what happened:
Before this patch, when loading an old class unsupported by CDS, `JavaCalls::call_virtual()` inside `ClassListParser::load_current_class()` will throw `java.lang.UnsupportedClassVersionError`. This exception is caught and discarded.
The code will then call `SystemDictionary::resolve_or_null()`, which returns `NULL` because the class is not found inside the boot loader. At this point, `load_current_class()` throws `java_lang_ClassNotFoundException`. `MetaspaceShared::preload_and_dump()` sees this and prints the "Preload Warning: Cannot find..." message.
After this patch, the `UnsupportedClassVersionError` is not caught anymore, so it will be seen inside `MetaspaceShared::preload_and_dump()`.
I updated the comments to mention the condition. I also created a new RFE (https://bugs.openjdk.java.net/browse/JDK-8263469) to improve the warning messages.
-------------
PR: https://git.openjdk.java.net/jdk/pull/2929
More information about the hotspot-runtime-dev
mailing list