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.

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

Commit messages:
 - updated javadoc for AOTSafeClassInitializer.java
 - Fix
 - imported

Changes: https://git.openjdk.org/jdk/pull/27402/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=27402&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8368174
  Stats: 288 lines in 11 files changed: 196 ins; 47 del; 45 mod
  Patch: https://git.openjdk.org/jdk/pull/27402.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/27402/head:pull/27402

PR: https://git.openjdk.org/jdk/pull/27402

Reply via email to