RFR(S): 8232081: Try to link all classes during dynamic CDS dump

Ioi Lam ioi.lam at oracle.com
Thu Feb 27 05:46:01 UTC 2020



On 2/26/20 7:50 PM, David Holmes wrote:
> Hi Calvin,
>
> Adding core-libs-dev as you are messing with their code :)
>
> On 27/02/2020 1:19 pm, Calvin Cheung wrote:
>> JBS: https://bugs.openjdk.java.net/browse/JDK-8232081
>> webrev: http://cr.openjdk.java.net/~ccheung/jdk15/8232081/webrev.00/
>>
>> The proposed changeset for this RFE adds a JVM_LinkClassesForCDS() 
>> function to be called from java/lang/Shutdown to notify the JVM to 
>> link the classes loaded by the builtin class loaders. The 
>
> This would be much less disruptive if this was handled purely on the 
> VM side once we have started shutdown. No need to make any changes to 
> the Java side then, nor jvm.cpp.
>

Hi David,

To link the classes, we need to be able to run Java code -- when linking 
a class X loaded by the app loader, X will be verified. During 
verification of X, we may need to load additional classes from the app 
loader, which executes Java code during its class loading operations.

We also need to handle all the exit conditions. As far as I can tell, an 
app can exit the JVM in two ways:

(1) Explicitly calling System.exit(). This will call 
java.lang.Shutdown.exit() which does this:

http://hg.openjdk.java.net/jdk/jdk/file/0edc7fd0d7a3/src/java.base/share/classes/java/lang/Shutdown.java#l163

             beforeHalt(); // native
             runHooks();
             halt(status);

(2) When all non-daemon threads have died (e.g., falling out of the 
bottom of HelloWorld.main()). There's no explicit call to System.exit(), 
but the JVM will proactively call java.lang.Shutdown.shutdown() inside 
JavaThread::invoke_shutdown_hooks()

http://hg.openjdk.java.net/jdk/jdk/file/0edc7fd0d7a3/src/hotspot/share/runtime/thread.cpp#l4331
http://hg.openjdk.java.net/jdk/jdk/file/0edc7fd0d7a3/src/java.base/share/classes/java/lang/Shutdown.java#l184

If we want to avoid modifying the Java code, I think we can intercept 
JVM_BeforeHalt() and JavaThread::invoke_shutdown_hooks(). This way we 
should be able to handle all the classes (except those that are loaded 
inside Shutdown.runHooks).

What do you think?

- Ioi

> Thanks,
> David
>
>> MetaspaceShared::link_and_cleanup_shared_classes() has been modified 
>> to handle both static and dynamic CDS dump. For dynamic CDS dump, 
>> only classes loaded by the builtin class loaders will be linked. 
>> Local performance testing using javac on HelloWorld.java shows an 
>> improvement of >5%.
>>
>> Passed tier1 - 4 tests.
>>
>> thanks,
>>
>> Calvin
>>



More information about the core-libs-dev mailing list