From ff1d9fe84c47fced60c2b1a8175cd9c4ea0af59d Mon Sep 17 00:00:00 2001 From: Mat Carter Date: Fri, 24 Oct 2025 15:36:38 -0700 Subject: [PATCH 1/7] 8369736 - Adding HotSpotAOTCache MXBean --- src/hotspot/share/include/jvm.h | 9 ++ src/hotspot/share/prims/jvm.cpp | 27 +++++ .../classes/sun/management/VMManagement.java | 7 +- .../sun/management/VMManagementImpl.java | 7 +- .../native/libmanagement/VMManagementImpl.c | 21 ++++ .../internal/HotSpotAOTCacheImpl.java | 55 +++++++++ .../internal/PlatformMBeanProviderImpl.java | 38 +++++- .../jdk/management/HotSpotAOTCacheMXBean.java | 109 ++++++++++++++++++ .../aotCache/HotSpotAOTCacheMXBeanTest.java | 109 ++++++++++++++++++ 9 files changed, 379 insertions(+), 3 deletions(-) create mode 100644 src/jdk.management/share/classes/com/sun/management/internal/HotSpotAOTCacheImpl.java create mode 100644 src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java create mode 100644 test/hotspot/jtreg/runtime/cds/appcds/aotCache/HotSpotAOTCacheMXBeanTest.java diff --git a/src/hotspot/share/include/jvm.h b/src/hotspot/share/include/jvm.h index ce76a95fda76a..0f94b5fdb88c2 100644 --- a/src/hotspot/share/include/jvm.h +++ b/src/hotspot/share/include/jvm.h @@ -87,6 +87,15 @@ JVM_InternString(JNIEnv *env, jstring str); /* * java.lang.System */ +JNIEXPORT jboolean JNICALL +JVM_AOTIsRecording(JNIEnv *env); + +JNIEXPORT jboolean JNICALL +JVM_AOTEndRecording(JNIEnv *env); + +JNIEXPORT jlong JNICALL +JVM_AOTGetRecordingDuration(JNIEnv *env); + JNIEXPORT jlong JNICALL JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored); diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp index 6b464ae8e3eee..82587750fe427 100644 --- a/src/hotspot/share/prims/jvm.cpp +++ b/src/hotspot/share/prims/jvm.cpp @@ -228,6 +228,33 @@ extern void trace_class_resolution(Klass* to_class) { // java.lang.System ////////////////////////////////////////////////////////////////////// +JVM_LEAF(jboolean, JVM_AOTIsRecording(JNIEnv *env)) +#if INCLUDE_CDS + return AOTMetaspace::is_recording_preimage_static_archive(); +#else + return JNI_FALSE; +#endif // INCLUDE_CDS +JVM_END + +JVM_ENTRY(jboolean, JVM_AOTEndRecording(JNIEnv *env)) +#if INCLUDE_CDS + if (AOTMetaspace::is_recording_preimage_static_archive()) { + AOTMetaspace::dump_static_archive(THREAD); + return JNI_TRUE; + } + return JNI_FALSE; +#else + return JNI_FALSE; +#endif // INCLUDE_CDS +JVM_END + +JVM_LEAF(jlong, JVM_AOTGetRecordingDuration(JNIEnv *env)) +#if INCLUDE_CDS + return AOTMetaspace::get_preimage_static_archive_recording_duration(); +#else + return 0; +#endif // INCLUDE_CDS +JVM_END JVM_LEAF(jlong, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)) return os::javaTimeMillis(); diff --git a/src/java.management/share/classes/sun/management/VMManagement.java b/src/java.management/share/classes/sun/management/VMManagement.java index f4445f0225af3..afe46e4803658 100644 --- a/src/java.management/share/classes/sun/management/VMManagement.java +++ b/src/java.management/share/classes/sun/management/VMManagement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,6 +48,11 @@ public interface VMManagement { public boolean isGcNotificationSupported(); public boolean isRemoteDiagnosticCommandsSupported(); + // AOT Subsytem + public boolean isAOTRecording(); + public long getAOTRecordingDuration(); + public boolean endAOTRecording(); + // Class Loading Subsystem public long getTotalClassCount(); public int getLoadedClassCount(); diff --git a/src/java.management/share/classes/sun/management/VMManagementImpl.java b/src/java.management/share/classes/sun/management/VMManagementImpl.java index 041f09547d2ba..fd6c14a47a354 100644 --- a/src/java.management/share/classes/sun/management/VMManagementImpl.java +++ b/src/java.management/share/classes/sun/management/VMManagementImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -117,6 +117,11 @@ public boolean isRemoteDiagnosticCommandsSupported() { public native boolean isThreadCpuTimeEnabled(); public native boolean isThreadAllocatedMemoryEnabled(); + // AOT Subsystem + public native boolean isAOTRecording(); + public native long getAOTRecordingDuration(); + public native boolean endAOTRecording(); + // Class Loading Subsystem public int getLoadedClassCount() { long count = getTotalClassCount() - getUnloadedClassCount(); diff --git a/src/java.management/share/native/libmanagement/VMManagementImpl.c b/src/java.management/share/native/libmanagement/VMManagementImpl.c index f1a566676dceb..2c4e9c43389ae 100644 --- a/src/java.management/share/native/libmanagement/VMManagementImpl.c +++ b/src/java.management/share/native/libmanagement/VMManagementImpl.c @@ -101,6 +101,27 @@ Java_sun_management_VMManagementImpl_getVmArguments0 return JVM_GetVmArguments(env); } +JNIEXPORT jboolean JNICALL +Java_sun_management_VMManagementImpl_isAOTRecording + (JNIEnv *env, jobject dummy) +{ + return JVM_AOTIsRecording(env); +} + +JNIEXPORT jlong JNICALL +Java_sun_management_VMManagementImpl_getAOTRecordingDuration + (JNIEnv *env, jobject dummy) +{ + return JVM_AOTGetRecordingDuration(env); +} + +JNIEXPORT jboolean JNICALL +Java_sun_management_VMManagementImpl_endAOTRecording + (JNIEnv *env, jobject dummy) +{ + return JVM_AOTEndRecording(env); +} + JNIEXPORT jlong JNICALL Java_sun_management_VMManagementImpl_getTotalClassCount (JNIEnv *env, jobject dummy) diff --git a/src/jdk.management/share/classes/com/sun/management/internal/HotSpotAOTCacheImpl.java b/src/jdk.management/share/classes/com/sun/management/internal/HotSpotAOTCacheImpl.java new file mode 100644 index 0000000000000..00fbb272b887c --- /dev/null +++ b/src/jdk.management/share/classes/com/sun/management/internal/HotSpotAOTCacheImpl.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2025, Microsoft, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.management.internal; + +import javax.management.ObjectName; +import jdk.management.HotSpotAOTCacheMXBean; +import sun.management.Util; +import sun.management.VMManagement; + +/** + * Implementation class for the AOT Cache subsystem. + * + * ManagementFactory.getRuntimeMXBean() returns an instance + * of this class. + */ +public class HotSpotAOTCacheImpl implements HotSpotAOTCacheMXBean { + + private final VMManagement jvm; + /** + * Constructor of HotSpotAOTCacheImpl class. + */ + HotSpotAOTCacheImpl(VMManagement vm) { + this.jvm = vm; + } + + public boolean endRecording(){ + return jvm.endAOTRecording(); + } + + public ObjectName getObjectName() { + return Util.newObjectName("jdk.management:type=HotSpotAOTCache"); + } +} \ No newline at end of file diff --git a/src/jdk.management/share/classes/com/sun/management/internal/PlatformMBeanProviderImpl.java b/src/jdk.management/share/classes/com/sun/management/internal/PlatformMBeanProviderImpl.java index 3a64fe6b858fe..b000516e626c1 100644 --- a/src/jdk.management/share/classes/com/sun/management/internal/PlatformMBeanProviderImpl.java +++ b/src/jdk.management/share/classes/com/sun/management/internal/PlatformMBeanProviderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,6 +39,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import javax.management.DynamicMBean; +import jdk.management.HotSpotAOTCacheMXBean; import jdk.management.VirtualThreadSchedulerMXBean; import sun.management.ManagementFactoryHelper; import sun.management.spi.PlatformMBeanProvider; @@ -159,6 +160,41 @@ public synchronized Map nameToMBeanMa } }); + /** + * HotSpotAOTCacheMXBean. + */ + initMBeanList.add(new PlatformComponent() { + private final Set> mbeanInterfaces = + Set.of(HotSpotAOTCacheMXBean.class); + private final Set mbeanInterfaceNames = + Set.of(HotSpotAOTCacheMXBean.class.getName()); + private HotSpotAOTCacheMXBean impl; + + @Override + public Set> mbeanInterfaces() { + return mbeanInterfaces; + } + + @Override + public Set mbeanInterfaceNames() { + return mbeanInterfaceNames; + } + + @Override + public String getObjectNamePattern() { + return "jdk.management:type=HotSpotAOTCache"; + } + + @Override + public Map nameToMBeanMap() { + HotSpotAOTCacheMXBean impl = this.impl; + if (impl == null) { + this.impl = impl = new HotSpotAOTCacheImpl(ManagementFactoryHelper.getVMManagement()); + } + return Map.of("jdk.management:type=HotSpotAOTCache", impl); + } + }); + /** * VirtualThreadSchedulerMXBean. */ diff --git a/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java b/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java new file mode 100644 index 0000000000000..22f542a35a561 --- /dev/null +++ b/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2025, Microsoft, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package jdk.management; + +import java.lang.management.ManagementFactory; +import java.lang.management.PlatformManagedObject; +import java.util.concurrent.ForkJoinPool; +import javax.management.MBeanServer; +import javax.management.ObjectName; + +/** + * Management interface for the JDK's Ahead of Time (AOT) optimizations. + * + * Currently, {@code HotSpotAOTCacheMXBean} defines one operation at this time to end the AOT recording. + * More operations and/or properties may be added in a future release. + * + *

The management interface is registered with the platform {@link MBeanServer + * MBeanServer}. The {@link ObjectName ObjectName} that uniquely identifies the management + * interface within the {@code MBeanServer} is: "jdk.management:type=HotSpotAOTCache". + * + *

Direct access to the MXBean interface can be obtained with + * {@link ManagementFactory#getPlatformMXBean(Class)}. + * + * @since 26 + */ +public interface HotSpotAOTCacheMXBean extends PlatformManagedObject { + /** + * If an AOT recording is in progress, ends the recording. This operation completes + * after the AOT artifacts have been completely written. + * + *

The JVM will start recording AOT artifacts upon start-up if certain JVM options are + * given in the command-line. The recording will stop when the JVM exits, or when + * the {@code endRecording} method is called. Examples: + * + *

java -XX:AOTCacheOutput=app.aot .... + * + *

+ * The JVM will record optimization information about the current application + * into the AOT cache file app.aot. In a future execution of this application, + * -XX:AOTCache=app.aot can be provided to improve the application's + * start-up and warm-up performance. + *
+ * + *

java -XX:AOTMode=record -XX:AOTConfiguration=app.aotconfig .... + * + *

+ * The JVM will record optimization information about the current application + * into the AOT configuration file app.aotconfig. Subsequently, an AOT cache + * file can be created with the command: + * + *

java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconfig -XX:AOTCache=app.aot ... + *

+ * + *

For more information about creating and using the AOT artifacts, and detailed + * specification of the corresponding JVM command-line options, please refer + * to https://openjdk.org/jeps/483 and https://openjdk.org/jeps/514. + * + *

Note: Currently there are no APIs to start an AOT recording. AOT recordings must be + * started using JVM command-line options such as -XX:AOTCacheOutput. + * + *

There are also no APIs to querying whether the AOT recording is in progress, or what AOT + * artifacts are being recorded. If such information is required by the application, it should be passed + * to the application via system properties or command-line arguments. For example: + * + *

java -XX:AOTCacheOutput=app.aot -Dmyapp.cache.output=app.aot -jar myapp.jar MyApp + * + *

+ * The application can contain logic like the following. Note that it's possible + * to access the AOT cache file using regular file I/O APIs after the endRecording() function + * has returned {@code true}. + *
+       * {@code
+       * HotSpotAOTCacheMXBean bean = ....;
+       * String aotCache = System.getProperty("myapp.cache.output");
+       * if (aotCache != null) {
+       *     System.out.println("JVM is recording into " + aotCache);
+       *     performSomeActionsThatNeedsToBeRecorded();
+       *     if (bean.endRecording()) {
+       *          System.out.println("Recording is successfully finished: " + aotCache);
+       *     }
+       * }
+ *
+ * + * @return {@code true} if a recording was in progress and has been ended successfully; {@code false} otherwise. + */ + public boolean endRecording(); +} \ No newline at end of file diff --git a/test/hotspot/jtreg/runtime/cds/appcds/aotCache/HotSpotAOTCacheMXBeanTest.java b/test/hotspot/jtreg/runtime/cds/appcds/aotCache/HotSpotAOTCacheMXBeanTest.java new file mode 100644 index 0000000000000..12c334e06c401 --- /dev/null +++ b/test/hotspot/jtreg/runtime/cds/appcds/aotCache/HotSpotAOTCacheMXBeanTest.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2025, Microsoft, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + + +/* + * @test + * @summary Sanity test for HotSpotAOTCache MXBean + * @requires vm.cds.write.archived.java.heap + * @library /test/jdk/lib/testlibrary /test/lib + * /test/hotspot/jtreg/runtime/cds/appcds/aotCache/test-classes + * @build HotSpotAOTCacheMXBeanTest + * @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar HotSpotAOTCacheMXBeanApp + * @run driver HotSpotAOTCacheMXBeanTest + */ + +import jdk.test.lib.cds.CDSAppTester; +import jdk.test.lib.helpers.ClassFileInstaller; +import jdk.test.lib.process.OutputAnalyzer; +import java.lang.management.ManagementFactory; +import jdk.management.HotSpotAOTCacheMXBean; + +public class HotSpotAOTCacheMXBeanTest { + static final String appJar = ClassFileInstaller.getJarPath("app.jar"); + static final String mainClass = "HotSpotAOTCacheMXBeanApp"; + public static void main(String[] args) throws Exception { + Tester tester = new Tester(); + tester.runAOTWorkflow(); + } + + static class Tester extends CDSAppTester { + public Tester() { + super(mainClass); + } + + @Override + public String classpath(RunMode runMode) { + return appJar; + } + + @Override + public String[] vmArgs(RunMode runMode) { + return new String[] { + "-Xlog:cds+class=trace", + "--add-modules=jdk.management" + }; + } + + @Override + public String[] appCommandLine(RunMode runMode) { + return new String[] { + mainClass, runMode.name() + }; + } + + @Override + public void checkExecution(OutputAnalyzer out, RunMode runMode) { + var name = runMode.name(); + if (runMode.isApplicationExecuted()) { + if(runMode == RunMode.TRAINING) { + out.shouldContain("Hello Leyden " + name); + out.shouldContain("Successfully stopped recording"); + } else if (runMode == RunMode.ASSEMBLY) { + out.shouldNotContain("Hello Leyden "); + } else if (runMode == RunMode.PRODUCTION) { + out.shouldContain("Hello Leyden " + name); + out.shouldContain("Failed to stop recording"); + } + out.shouldNotContain("HotSpotAOTCacheMXBean is not available"); + } + } + } +} + +class HotSpotAOTCacheMXBeanApp { + public static void main(String[] args) { + System.out.println("Hello Leyden " + args[0]); + var aotBean = ManagementFactory.getPlatformMXBean(HotSpotAOTCacheMXBean.class); + if (aotBean == null) { + System.out.println("HotSpotAOTCacheMXBean is not available"); + return; + } + if (aotBean.endRecording()) { + System.out.println("Successfully stopped recording"); + } else { + System.out.println("Failed to stop recording"); + } + } +} \ No newline at end of file From 74537ff9f49b2d2cafde055b79cb6f98131c9ce9 Mon Sep 17 00:00:00 2001 From: Mat Carter Date: Mon, 27 Oct 2025 18:19:29 -0700 Subject: [PATCH 2/7] Removed extra functionality --- src/hotspot/share/include/jvm.h | 6 ----- src/hotspot/share/prims/jvm.cpp | 24 ++++--------------- .../classes/sun/management/VMManagement.java | 4 +--- .../sun/management/VMManagementImpl.java | 2 -- .../native/libmanagement/VMManagementImpl.c | 14 ----------- 5 files changed, 6 insertions(+), 44 deletions(-) diff --git a/src/hotspot/share/include/jvm.h b/src/hotspot/share/include/jvm.h index 0f94b5fdb88c2..5ad7b5e3d3811 100644 --- a/src/hotspot/share/include/jvm.h +++ b/src/hotspot/share/include/jvm.h @@ -87,15 +87,9 @@ JVM_InternString(JNIEnv *env, jstring str); /* * java.lang.System */ -JNIEXPORT jboolean JNICALL -JVM_AOTIsRecording(JNIEnv *env); - JNIEXPORT jboolean JNICALL JVM_AOTEndRecording(JNIEnv *env); -JNIEXPORT jlong JNICALL -JVM_AOTGetRecordingDuration(JNIEnv *env); - JNIEXPORT jlong JNICALL JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored); diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp index 82587750fe427..a2b4762f34c69 100644 --- a/src/hotspot/share/prims/jvm.cpp +++ b/src/hotspot/share/prims/jvm.cpp @@ -228,19 +228,13 @@ extern void trace_class_resolution(Klass* to_class) { // java.lang.System ////////////////////////////////////////////////////////////////////// -JVM_LEAF(jboolean, JVM_AOTIsRecording(JNIEnv *env)) -#if INCLUDE_CDS - return AOTMetaspace::is_recording_preimage_static_archive(); -#else - return JNI_FALSE; -#endif // INCLUDE_CDS -JVM_END - JVM_ENTRY(jboolean, JVM_AOTEndRecording(JNIEnv *env)) #if INCLUDE_CDS - if (AOTMetaspace::is_recording_preimage_static_archive()) { - AOTMetaspace::dump_static_archive(THREAD); - return JNI_TRUE; + if (CDSConfig::is_dumping_preimage_static_archive()) { + if (AOTMetaspace::is_recording_preimage_static_archive()) { + AOTMetaspace::dump_static_archive(THREAD); + return JNI_TRUE; + } } return JNI_FALSE; #else @@ -248,14 +242,6 @@ JVM_ENTRY(jboolean, JVM_AOTEndRecording(JNIEnv *env)) #endif // INCLUDE_CDS JVM_END -JVM_LEAF(jlong, JVM_AOTGetRecordingDuration(JNIEnv *env)) -#if INCLUDE_CDS - return AOTMetaspace::get_preimage_static_archive_recording_duration(); -#else - return 0; -#endif // INCLUDE_CDS -JVM_END - JVM_LEAF(jlong, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)) return os::javaTimeMillis(); JVM_END diff --git a/src/java.management/share/classes/sun/management/VMManagement.java b/src/java.management/share/classes/sun/management/VMManagement.java index afe46e4803658..6548ae346d92c 100644 --- a/src/java.management/share/classes/sun/management/VMManagement.java +++ b/src/java.management/share/classes/sun/management/VMManagement.java @@ -48,9 +48,7 @@ public interface VMManagement { public boolean isGcNotificationSupported(); public boolean isRemoteDiagnosticCommandsSupported(); - // AOT Subsytem - public boolean isAOTRecording(); - public long getAOTRecordingDuration(); + // AOT Subsystem public boolean endAOTRecording(); // Class Loading Subsystem diff --git a/src/java.management/share/classes/sun/management/VMManagementImpl.java b/src/java.management/share/classes/sun/management/VMManagementImpl.java index fd6c14a47a354..e91d7955369d3 100644 --- a/src/java.management/share/classes/sun/management/VMManagementImpl.java +++ b/src/java.management/share/classes/sun/management/VMManagementImpl.java @@ -118,8 +118,6 @@ public boolean isRemoteDiagnosticCommandsSupported() { public native boolean isThreadAllocatedMemoryEnabled(); // AOT Subsystem - public native boolean isAOTRecording(); - public native long getAOTRecordingDuration(); public native boolean endAOTRecording(); // Class Loading Subsystem diff --git a/src/java.management/share/native/libmanagement/VMManagementImpl.c b/src/java.management/share/native/libmanagement/VMManagementImpl.c index 2c4e9c43389ae..dc8ad3c5c19b5 100644 --- a/src/java.management/share/native/libmanagement/VMManagementImpl.c +++ b/src/java.management/share/native/libmanagement/VMManagementImpl.c @@ -101,20 +101,6 @@ Java_sun_management_VMManagementImpl_getVmArguments0 return JVM_GetVmArguments(env); } -JNIEXPORT jboolean JNICALL -Java_sun_management_VMManagementImpl_isAOTRecording - (JNIEnv *env, jobject dummy) -{ - return JVM_AOTIsRecording(env); -} - -JNIEXPORT jlong JNICALL -Java_sun_management_VMManagementImpl_getAOTRecordingDuration - (JNIEnv *env, jobject dummy) -{ - return JVM_AOTGetRecordingDuration(env); -} - JNIEXPORT jboolean JNICALL Java_sun_management_VMManagementImpl_endAOTRecording (JNIEnv *env, jobject dummy) From d58c5147bc9a968960ab996f1e236247411a805c Mon Sep 17 00:00:00 2001 From: Mat Carter Date: Mon, 27 Oct 2025 18:22:16 -0700 Subject: [PATCH 3/7] Removed whitespace --- .../share/classes/jdk/management/HotSpotAOTCacheMXBean.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java b/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java index 22f542a35a561..c406c6538ae0b 100644 --- a/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java +++ b/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java @@ -33,7 +33,7 @@ /** * Management interface for the JDK's Ahead of Time (AOT) optimizations. * - * Currently, {@code HotSpotAOTCacheMXBean} defines one operation at this time to end the AOT recording. + * Currently, {@code HotSpotAOTCacheMXBean} defines one operation at this time to end the AOT recording. * More operations and/or properties may be added in a future release. * *

The management interface is registered with the platform {@link MBeanServer @@ -70,14 +70,14 @@ public interface HotSpotAOTCacheMXBean extends PlatformManagedObject { * into the AOT configuration file app.aotconfig. Subsequently, an AOT cache * file can be created with the command: * - *

java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconfig -XX:AOTCache=app.aot ... + *

java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconfig -XX:AOTCache=app.aot ... *

* *

For more information about creating and using the AOT artifacts, and detailed * specification of the corresponding JVM command-line options, please refer * to https://openjdk.org/jeps/483 and https://openjdk.org/jeps/514. * - *

Note: Currently there are no APIs to start an AOT recording. AOT recordings must be + *

Note: Currently there are no APIs to start an AOT recording. AOT recordings must be * started using JVM command-line options such as -XX:AOTCacheOutput. * *

There are also no APIs to querying whether the AOT recording is in progress, or what AOT From 993f6184c933ba962fcf849a5bec8ca69d1a643b Mon Sep 17 00:00:00 2001 From: Mat Carter <54955201+macarte@users.noreply.github.com> Date: Tue, 28 Oct 2025 11:55:58 -0700 Subject: [PATCH 4/7] Update src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java Co-authored-by: Dan Heidinga --- .../share/classes/jdk/management/HotSpotAOTCacheMXBean.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java b/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java index c406c6538ae0b..54d1fa88134df 100644 --- a/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java +++ b/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java @@ -51,7 +51,7 @@ public interface HotSpotAOTCacheMXBean extends PlatformManagedObject { * after the AOT artifacts have been completely written. * *

The JVM will start recording AOT artifacts upon start-up if certain JVM options are - * given in the command-line. The recording will stop when the JVM exits, or when + * supplied on the command-line. The recording will stop when the JVM exits, or when * the {@code endRecording} method is called. Examples: * *

java -XX:AOTCacheOutput=app.aot .... From 2285a683ebae2257b8a5b900d784eb64c4cb1576 Mon Sep 17 00:00:00 2001 From: Mat Carter <54955201+macarte@users.noreply.github.com> Date: Tue, 28 Oct 2025 11:56:17 -0700 Subject: [PATCH 5/7] Update src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java Co-authored-by: Dan Heidinga --- .../share/classes/jdk/management/HotSpotAOTCacheMXBean.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java b/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java index 54d1fa88134df..d6d4e1115faf5 100644 --- a/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java +++ b/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java @@ -58,7 +58,7 @@ public interface HotSpotAOTCacheMXBean extends PlatformManagedObject { * *

* The JVM will record optimization information about the current application - * into the AOT cache file app.aot. In a future execution of this application, + * that will be used to generate the AOT cache file app.aot. In a future execution of this application, * -XX:AOTCache=app.aot can be provided to improve the application's * start-up and warm-up performance. *
From 59ed2e0b4bbeeb30b4fb22075dd2c3ccda4df59f Mon Sep 17 00:00:00 2001 From: Mat Carter Date: Wed, 29 Oct 2025 11:45:34 -0700 Subject: [PATCH 6/7] Wording and format changes --- .../jdk/management/HotSpotAOTCacheMXBean.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java b/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java index c406c6538ae0b..9958acac8ef44 100644 --- a/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java +++ b/src/jdk.management/share/classes/jdk/management/HotSpotAOTCacheMXBean.java @@ -26,14 +26,13 @@ import java.lang.management.ManagementFactory; import java.lang.management.PlatformManagedObject; -import java.util.concurrent.ForkJoinPool; import javax.management.MBeanServer; import javax.management.ObjectName; /** - * Management interface for the JDK's Ahead of Time (AOT) optimizations. + * Management interface for the JDK's Ahead of Time (AOT) Cache. * - * Currently, {@code HotSpotAOTCacheMXBean} defines one operation at this time to end the AOT recording. + * {@code HotSpotAOTCacheMXBean} defines one operation at this time to end the AOT recording. * More operations and/or properties may be added in a future release. * *

The management interface is registered with the platform {@link MBeanServer @@ -71,7 +70,7 @@ public interface HotSpotAOTCacheMXBean extends PlatformManagedObject { * file can be created with the command: * *

java -XX:AOTMode=create -XX:AOTConfiguration=app.aotconfig -XX:AOTCache=app.aot ... - *

+ *
* *

For more information about creating and using the AOT artifacts, and detailed * specification of the corresponding JVM command-line options, please refer @@ -91,7 +90,6 @@ public interface HotSpotAOTCacheMXBean extends PlatformManagedObject { * to access the AOT cache file using regular file I/O APIs after the endRecording() function * has returned {@code true}. *

-       * {@code
        * HotSpotAOTCacheMXBean bean = ....;
        * String aotCache = System.getProperty("myapp.cache.output");
        * if (aotCache != null) {
@@ -100,8 +98,8 @@ public interface HotSpotAOTCacheMXBean extends PlatformManagedObject {
        *     if (bean.endRecording()) {
        *          System.out.println("Recording is successfully finished: " + aotCache);
        *     }
-       * }
- *
+ * } + *
* * @return {@code true} if a recording was in progress and has been ended successfully; {@code false} otherwise. */ From d48a200f7884cda679933f99ccf56e1119867daf Mon Sep 17 00:00:00 2001 From: Mat Carter Date: Wed, 29 Oct 2025 14:02:19 -0700 Subject: [PATCH 7/7] Updated test based on comments --- .../aotCache/HotSpotAOTCacheMXBeanTest.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/test/hotspot/jtreg/runtime/cds/appcds/aotCache/HotSpotAOTCacheMXBeanTest.java b/test/hotspot/jtreg/runtime/cds/appcds/aotCache/HotSpotAOTCacheMXBeanTest.java index 12c334e06c401..8483fe1b1de66 100644 --- a/test/hotspot/jtreg/runtime/cds/appcds/aotCache/HotSpotAOTCacheMXBeanTest.java +++ b/test/hotspot/jtreg/runtime/cds/appcds/aotCache/HotSpotAOTCacheMXBeanTest.java @@ -34,11 +34,13 @@ * @run driver HotSpotAOTCacheMXBeanTest */ +import java.io.IOException; +import java.lang.management.ManagementFactory; +import javax.management.MBeanServer; +import jdk.management.HotSpotAOTCacheMXBean; import jdk.test.lib.cds.CDSAppTester; import jdk.test.lib.helpers.ClassFileInstaller; import jdk.test.lib.process.OutputAnalyzer; -import java.lang.management.ManagementFactory; -import jdk.management.HotSpotAOTCacheMXBean; public class HotSpotAOTCacheMXBeanTest { static final String appJar = ClassFileInstaller.getJarPath("app.jar"); @@ -87,6 +89,7 @@ public void checkExecution(OutputAnalyzer out, RunMode runMode) { out.shouldContain("Failed to stop recording"); } out.shouldNotContain("HotSpotAOTCacheMXBean is not available"); + out.shouldNotContain("IOException occurred!"); } } } @@ -95,15 +98,22 @@ public void checkExecution(OutputAnalyzer out, RunMode runMode) { class HotSpotAOTCacheMXBeanApp { public static void main(String[] args) { System.out.println("Hello Leyden " + args[0]); - var aotBean = ManagementFactory.getPlatformMXBean(HotSpotAOTCacheMXBean.class); - if (aotBean == null) { - System.out.println("HotSpotAOTCacheMXBean is not available"); - return; - } - if (aotBean.endRecording()) { - System.out.println("Successfully stopped recording"); - } else { - System.out.println("Failed to stop recording"); + try { + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + HotSpotAOTCacheMXBean aotBean = ManagementFactory.newPlatformMXBeanProxy(server, + "jdk.management:type=HotSpotAOTCache", + HotSpotAOTCacheMXBean.class); + if (aotBean == null) { + System.out.println("HotSpotAOTCacheMXBean is not available"); + return; + } + if (aotBean.endRecording()) { + System.out.println("Successfully stopped recording"); + } else { + System.out.println("Failed to stop recording"); + } + } catch (IOException e) { + System.out.println("IOException occurred!"); } } } \ No newline at end of file