RFR: 8356212: runtime/cds/appcds/LotsOfSyntheticClasses.java timed out with -XX:+AOTClassLinking

Calvin Cheung ccheung at openjdk.org
Fri May 9 16:22:00 UTC 2025


On Thu, 8 May 2025 15:39:03 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:

>> The LotsOfSyntheticClasses.java test times out intermittently when the `open/test/hotspot/jtreg:hotspot_aot_classlinking` test group is run with the` -XX:+AOTClassLinking` option on macosx-aarch64 platform.
>> Increasing the timeout value from 500 to 800 seems to have addressed the issue.
>> With the change, there's no timeout when the test group is run 40 times on macosx-aarch64 with the same option.
>
> Quick profiling shows we spend _a lot_ of time in class inits and SystemDictionary verification. Some of this can be alleviated by skipping the verification.
> 
> Also, a different route: the test is a regression test for JDK-8342283. That bug is about backing storage in `Map<Class, ...>`, `List<Class, ...>` exceeding CDS archival limit (256KB). So nominally, we want 256KB / 4 bytes = 64K classes in this test.
> 
> So I propose in addition to bumping the timeout, we also optimize the test like this:
> 
> 
> diff --git a/test/hotspot/jtreg/runtime/cds/appcds/LotsOfSyntheticClasses.java b/test/hotspot/jtreg/runtime/cds/appcds/LotsOfSyntheticClasses.java
> index 96d2dc0d6ee..6267c6bdf33 100644
> --- a/test/hotspot/jtreg/runtime/cds/appcds/LotsOfSyntheticClasses.java
> +++ b/test/hotspot/jtreg/runtime/cds/appcds/LotsOfSyntheticClasses.java
> @@ -42,9 +42,12 @@
>  
>  public class LotsOfSyntheticClasses {
>  
> -    // Generate 100 top-level classes, each containing 1000 nested classes.
> -    // 100K total classes are more than enough to push the CDS limits.
> -    private static final int NUM_CLASSES = 100;
> +    // Generate 70 top-level classes, each containing 1000 nested classes.
> +    // 70K total classes is enough to push the CDS limits. Any archived
> +    // collection that holds Classes should not have backing storage larger
> +    // than CDS archival limit (256KB). This means we want at least 64K classes
> +    // to probe that limit.
> +    private static final int NUM_CLASSES = 70;
>      private static final int NUM_NESTED_CLASSES = 1000;
>  
>      private static final Path USER_DIR = Paths.get(CDSTestUtils.getOutputDir());
> @@ -117,7 +120,11 @@ public static void main(String[] args) throws Exception {
>              OutputAnalyzer output = TestCommon.createArchive(
>                  APP_JAR.toString(),
>                  listAppClasses(),
> -                MAIN_CLASS_NAME
> +                MAIN_CLASS_NAME,
> +                // Verification for lots of classes slows down the test.
> +                "-XX:+IgnoreUnrecognizedVMOptions",
> +                "-XX:-VerifyDependencies",
> +                "-XX:-VerifyBeforeExit"
>              );
>              TestCommon.checkDump(output);
>          }
> @@ -125,9 +132,10 @@ public static void main(String[] args) throws Exception {
>          // Step 3. Try to run, touching every class.
>          {
>              TestCommon.run(
> -                // Verifying dependencies for lots of classes slows down the test.
> -                "-XX:+IgnoreUnrecognizedVMOptions", "-XX:-VerifyDe...

Thanks @shipilev @sendaoYan @iklam for the review.

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

PR Comment: https://git.openjdk.org/jdk/pull/25111#issuecomment-2867127249


More information about the hotspot-runtime-dev mailing list