On Mon, 22 Sep 2025 19:42:39 GMT, Ashutosh Mehra <[email protected]> wrote:

>> This is an alternative to https://github.com/openjdk/jdk/pull/27024. Thanks 
>> to @ashu-mehra for the suggestion.
>> 
>> ### Background:
>> 
>> The AOT Assembly Phase is in essence a small Java program that executes a 
>> limited set of Java bytecodes. This program bootstraps the module system, 
>> loads classes, and performs certain ahead-of-time optimizations such as 
>> resolving `invokedynamic` call sites.
>> 
>> As a side effect of Java program execution, a small set of Java classes are 
>> initialized in the Assembly Phase.
>> 
>> Since [JDK-8360163](https://bugs.openjdk.org/browse/JDK-8360163), if a class 
>> `X` is annotated with `@AOTSafeClassInitializer` *and* is initialized in the 
>> Assembly Phase, then `X` will be stored in the AOT cache in the 
>> "initialized" state. When the AOT cache is used in the Production Run, 
>> `X::<clinit>` will not be executed, and the static variables of `X` will be 
>> available upon JVM bootstrap.
>> 
>> ### Problem:
>> 
>> The Assembly Phase doesn't touch many classes that may benefit from 
>> `@AOTSafeClassInitializer`. For example, 
>> `jdk.internal.math.MathUtils::<clinit>` creates a few large tables. Caching 
>> `MathUtils` in the "initialized" state will improve start-up time. However, 
>> since no bytecodes executed by the Assembly Phase use `MathUtils`. it will 
>> not be initialized.
>> 
>> ### Fix:
>> 
>> If a class `X` has the `@AOTSafeClassInitializer` annotation *and* was 
>> initialized in the AOT Training Run, the JVM will proactively initialize `X` 
>> in the Assembly Phase. This will ensure that `X` will be cached in the 
>> "initialized" state.
>> 
>> As a proof of concept, `@AOTSafeClassInitializer` is added to `MathUtils`. 
>> `@AOTSafeClassInitializer` will be added to more classes in future RFEs.
>
> src/hotspot/share/cds/aotClassInitializer.cpp line 53:
> 
>> 51: 
>> 52:   if (!ik->is_initialized() && !ik->is_being_initialized()) {
>> 53:     if (ik->has_aot_safe_initializer()) {
> 
> Now that we are forcing initialization of classes annotated with 
> `AOTSafeClassInitializer`, is it still possible that a class is not 
> initialized but `has_aot_safe_initializer()` is true?

It's possible in some rare circumstances. I.e, in the assembly phase, we take a 
path that was not cover in the training run (e.g. some sort of advanced JLI 
linkage). We could load a class X without initializing it. This could happen if 
X is used only for instanceof checking, or if it was loaded during verification 
of other classes.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/27402#discussion_r2370329695

Reply via email to