On Sat, 20 Sep 2025 02:57:50 GMT, Ioi Lam <[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?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/27402#discussion_r2370086101