RFR: 8372253: Improve logging to show why a class was excluded from AOT Cache

María Arias de Reyna Domínguez duke at openjdk.org
Fri Nov 21 08:22:15 UTC 2025


On Thu, 20 Nov 2025 20:33:40 GMT, Ioi Lam <iklam at openjdk.org> wrote:

>> Fixes: https://bugs.openjdk.org/browse/JDK-8372253
>> 
>> When dumping the AOT Cache file, some classes throw a verification error and are excluded from the cache:
>> 
>> 
>> [warning][aot] Preload Warning: Verification failed for io.netty.handler.ssl.OpenSslClientContext 
>> [warning][aot] Skipping io/netty/handler/ssl/OpenSslClientContext: Failed verification
>> 
>> 
>> This PR improves the log message by adding the cause of this failure:
>> 
>> 
>> [warning][aot] Preload Warning: Verification failed for io.netty.handler.ssl.OpenSslClientContext because a java.lang.NoClassDefFoundError was thrown: io/netty/internal/tcnative/SSLPrivateKeyMethod
>
> Thanks for making the changes. I have a written a test case.
> 
> 
> class ExclusionTest {
>     public void main() {
>         System.out.println("I am not calling getFoo()");
>     }
> 
>     // The verification of this method adds a verification constraint:
>     //     Bar must be a subclass of Foo
>     //
>     // Note that the verification of this class only loads Bar and Foo
>     // to check that Bar is a subclass of Foo. It does not cause
>     // Bar and Foo to be immediately verified.
>     //
>     // Bar and Foo are verified only when the app uses them, or
>     // in the case of AOT training, they are verified after the app
>     // has exited but before we write the AOT config file.
>     Foo getFoo() {
>         return new Bar();
>     }
> }
> 
> // Foo is verified at the end of the training run in AOTMetaspace::link_all_loaded_classes().
> // This is AFTER the app has exited.
> class Foo {}
> 
> // Bar is also verified at end of the training run. The verification will fail
> // because Baz cannot be loaded,
> //
> // As a result, Bar is excluded from the AOT config.
> // ExclusionTest is also excluded, because its verification depended on Bar.
> class Bar extends Foo {
>     Bar getBar() {
>         return new Baz(); // Bar cannot be verified if Baz class cannot be loaded,
>     }
> }
> 
> // Do NOT put this class in the classpath
> class Baz extends Bar {}
> 
> 
> With the new log added by this PR, we can now understand why `Bar` and `ExclusionTest` are excluded:
> 
> 
> $ rm -rf tmpclasses
> $ mkdir -p tmpclasses
> $ javac -d tmpclasses ExclusionTest.java
> $ rm tmpclasses/Baz.class
> $ jar cvf ExclusionTest.jar -C tmpclasses .
> 
> $ java -XX:AOTMode=record -XX:AOTConfiguration=test.aotconf \
>     -cp ExclusionTest.jar ExclusionTest | egrep '(Skip)|(Preload)'
> [0.125s][warning][aot] Preload Warning: Verification failed for Bar because a 
>      java.lang.NoClassDefFoundError was thrown: Baz
> [...]
> [0.242s][warning][aot] Skipping Bar: Failed verification
> [0.242s][info   ][aot] Skipping ExclusionTest: verification constraint Bar is excluded

@iklam should we add the test case to this PR? Otherwise, feel free to /sponsor me

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

PR Comment: https://git.openjdk.org/jdk/pull/28413#issuecomment-3561911585


More information about the hotspot-runtime-dev mailing list