openj9
openj9 copied to clipboard
Implement initial RAM class persistence feature
This PR revives RAM class persistence work. It currently rebases/implements: https://github.ibm.com/runtimes/openj9-stratum/pull/7 and https://github.ibm.com/runtimes/openj9-stratum/pull/25.
Current considerations/limitations:
- No JIT support (i.e.
-Xintrequired) - Incompatible with SCC (i.e.
-Xshareclasses:nonerequired) - ASLR must be turned off (I've been using
echo 0 | sudo tee /proc/sys/kernel/randomize_va_spaceto turn this off) - Build must be configured with
--enable-snapshots(requires extension repo patches) - Only creates snapshot on VM exit. Further support for triggering points during execution is underway.
- No functionality to auto-detect whether a specified cache is compatible with the current invocation. (i.e. if you specify
ramCacheas the cache name for one program, then again for a different program, it will try to reuse the created cache rather than recognizing that it is incompatible and emitting a warning or deleting it and creating a new one). - Development only for JDK8, need to reassess to see what is required for later versions.
Example:
# Ensure ASLR is disabled (echo 2 to reset to default)
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
# Run the java program, creating a cache called "ramCache" that persists RAM class data
java -Xint -Xshareclasses:none -Xsnapshot=ramCache <java-program>
# Run the same java program, loading the persisted RAM class data from an image called "ramCache"
java -Xint -Xshareclasses:none -Xsnapshot=ramCache <java-program>
Signed-off-by: Nathan Henderson [email protected]
ping @babsingh
fyi @tajila @gacholio @hangshao0
@keithc-ca I've addressed your comments. And rebased to resolve the merge conflicts.
Jenkins test sanity.functional amac jdk11,jdk21
Jenkins test sanity.functional zlinux jdk8
Current intent: We aim to merge the initial VM support so that JIT and GC work can begin. We'll start by pushing initial changes in a disabled state. Once minimal functional support is in place, we’ll introduce builds to enable and test these changes. The current PR builds will ensure nothing breaks. There may be potential for improvements, which we’ll address, along with subsequent code reviews, in future PRs.
Previous PR builds all passed: https://openj9-jenkins.osuosl.org/job/Build_JDK11_aarch64_mac_Personal/581/ https://openj9-jenkins.osuosl.org/job/Build_JDK21_aarch64_mac_Personal/233/ https://openj9-jenkins.osuosl.org/job/Build_JDK8_s390x_linux_Personal/824/ https://openj9-jenkins.osuosl.org/job/PullRequest-OpenJ9/6370/ https://openj9-jenkins.osuosl.org/job/Test_openjdk11_j9_sanity.functional_aarch64_mac_Personal/220/ https://openj9-jenkins.osuosl.org/job/Test_openjdk21_j9_sanity.functional_aarch64_mac_Personal/130/ https://openj9-jenkins.osuosl.org/job/Test_openjdk8_j9_sanity.functional_s390x_linux_Personal/353/
@keithc-ca Please take another look when you have some time.
The delta is quite large since the last PR builds. So, I will relaunch the PR builds just to be safe. These changes are being merged in a disabled state; also, a perf sanity test was done earlier to make sure that there is no impact on startup and footprint.
Jenkins test sanity.functional amac jdk11,jdk21
Jenkins test sanity.functional zlinux jdk8
Two JDK8 failures are seen:
- https://openj9-jenkins.osuosl.org/job/Test_openjdk8_j9_sanity.functional_s390x_linux_Personal_testList_0/351/console
- https://openj9-jenkins.osuosl.org/job/Test_openjdk8_j9_sanity.functional_s390x_linux_Personal_testList_1/344/console
The new native method isOpenSSLFIPS was added yesterday: https://github.com/ibmruntimes/openj9-openjdk-jdk8/pull/779. Probably, Java_jdk_crypto_jniprovider_NativeCrypto_ECDSASign was missed to be added in closed/make/mapfiles/libjncrypto/mapfile-vers. But, this failure is unrelated to this PR.
02:15:03 /home/jenkins/workspace/Test_openjdk8_j9_sanity.functional_s390x_linux_Personal_testList_0/aqa-tests/TKG/scripts/build_tools.xml:37: java.lang.UnsatisfiedLinkError: jdk/crypto/jniprovider/NativeCrypto.isOpenSSLFIPS()Z
02:15:03 at jdk.crypto.jniprovider.NativeCrypto.<clinit>(NativeCrypto.java:89)
02:15:03 at sun.security.provider.SunEntries.<clinit>(SunEntries.java:104)
02:15:03 at sun.security.provider.Sun.<init>(Sun.java:56)
02:15:03 at java.lang.J9VMInternals.newInstanceImpl(Native Method)
02:15:03 at java.lang.Class.newInstance(Class.java:2130)
02:15:03 at sun.security.jca.ProviderConfig$2.run(ProviderConfig.java:237)
02:15:03 at sun.security.jca.ProviderConfig$2.run(ProviderConfig.java:222)
02:15:03 at java.security.AccessController.doPrivileged(AccessController.java:690)
02:15:03 at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:222)
02:15:03 at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:203)
02:15:03 at sun.security.jca.ProviderList.getProvider(ProviderList.java:256)
02:15:03 at sun.security.jca.ProviderList$3.get(ProviderList.java:171)
02:15:03 at sun.security.jca.ProviderList$3.get(ProviderList.java:166)
02:15:03 at java.util.AbstractList$Itr.next(AbstractList.java:358)
02:15:03 at java.security.SecureRandom.getPrngAlgorithm(SecureRandom.java:574)
02:15:03 at java.security.SecureRandom.getDefaultPRNG(SecureRandom.java:208)
02:15:03 at java.security.SecureRandom.<init>(SecureRandom.java:170)
02:15:03 at java.io.File$TempDirectory.<clinit>(File.java:1940)
02:15:03 at java.io.File.createTempFile(File.java:2049)
02:15:03 at org.apache.tools.ant.util.FileUtils.createTempFile(FileUtils.java:950)
02:15:03 at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:547)
02:15:03 at org.apache.tools.ant.taskdefs.compilers.JavacExternal.execute(JavacExternal.java:63)
02:15:03 at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1404)
02:15:03 at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:1133)
02:15:03 at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
02:15:03 at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
02:15:03 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
02:15:03 at java.lang.reflect.Method.invoke(Method.java:503)
02:15:03 at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99)
02:15:03 at org.apache.tools.ant.Task.perform(Task.java:350)
02:15:03 at org.apache.tools.ant.Target.execute(Target.java:449)
02:15:03 at org.apache.tools.ant.Target.performTasks(Target.java:470)
02:15:03 at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1388)
02:15:03 at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:36)
02:15:03 at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
02:15:03 at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:437)
02:15:03 at org.apache.tools.ant.taskdefs.CallTarget.execute(CallTarget.java:105)
02:15:03 at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
02:15:03 at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
02:15:03 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
02:15:03 at java.lang.reflect.Method.invoke(Method.java:503)
02:15:03 at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99)
02:15:03 at org.apache.tools.ant.Task.perform(Task.java:350)
02:15:03 at org.apache.tools.ant.Target.execute(Target.java:449)
02:15:03 at org.apache.tools.ant.Target.performTasks(Target.java:470)
02:15:03 at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1388)
02:15:03 at org.apache.tools.ant.Project.executeTarget(Project.java:1361)
02:15:03 at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
02:15:03 at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
02:15:03 at org.apache.tools.ant.Main.runBuild(Main.java:834)
02:15:03 at org.apache.tools.ant.Main.startAnt(Main.java:223)
02:15:03 at org.apache.tools.ant.launch.Launcher.run(Launcher.java:284)
02:15:03 at org.apache.tools.ant.launch.Launcher.main(Launcher.java:101)
Opened https://github.com/ibmruntimes/openj9-openjdk-jdk8/pull/780 to fix the above linkage failure.