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