mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-10 21:50:07 +00:00
8278131: runtime/cds/appcds/dynamicArchive/* tests failing in loom repo
Reviewed-by: iklam, dholmes, minqi
This commit is contained in:
parent
e6b28e05c6
commit
0dbe4c5d51
@ -32,6 +32,7 @@
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodHandles.Lookup;
|
||||
import java.lang.invoke.MethodHandles.Lookup.ClassOption;
|
||||
import static java.lang.invoke.MethodHandles.Lookup.ClassOption.*;
|
||||
import jdk.test.lib.compiler.InMemoryJavaCompiler;
|
||||
|
||||
@ -44,12 +45,19 @@ public class InstantiateHiddenClass {
|
||||
" } } ");
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
// This class is also used by the appcds/dynamicArchive/RegularHiddenClass.java
|
||||
// test which will pass the "keep-alive" argument during dynamic CDS dump
|
||||
// for preventing from being GC'ed prior to the dumping operation.
|
||||
boolean keepAlive = false;
|
||||
if (args.length == 1 && args[0].equals("keep-alive")) {
|
||||
keepAlive = true;
|
||||
}
|
||||
|
||||
// Test that a hidden class cannot be found through its name.
|
||||
try {
|
||||
Lookup lookup = MethodHandles.lookup();
|
||||
Class<?> cl = lookup.defineHiddenClass(klassbuf, false, NESTMATE).lookupClass();
|
||||
Class.forName(cl.getName()).newInstance();
|
||||
Class<?> c0 = lookup.defineHiddenClass(klassbuf, false, NESTMATE).lookupClass();
|
||||
Class.forName(c0.getName()).newInstance();
|
||||
throw new RuntimeException("Expected ClassNotFoundException not thrown");
|
||||
} catch (ClassNotFoundException e ) {
|
||||
// Test passed
|
||||
@ -60,8 +68,9 @@ public class InstantiateHiddenClass {
|
||||
// Verify that the references to these objects are different and references
|
||||
// to their classes are not equal either.
|
||||
Lookup lookup = MethodHandles.lookup();
|
||||
Class<?> c1 = lookup.defineHiddenClass(klassbuf, false, NESTMATE).lookupClass();
|
||||
Class<?> c2 = lookup.defineHiddenClass(klassbuf, false, NESTMATE).lookupClass();
|
||||
ClassOption classOption = keepAlive ? STRONG : NESTMATE;
|
||||
Class<?> c1 = lookup.defineHiddenClass(klassbuf, false, classOption).lookupClass();
|
||||
Class<?> c2 = lookup.defineHiddenClass(klassbuf, false, classOption).lookupClass();
|
||||
Object o1 = c1.newInstance();
|
||||
Object o2 = c2.newInstance();
|
||||
if (o1 == o2) {
|
||||
|
||||
@ -30,10 +30,12 @@ import jdk.test.lib.classloader.ClassUnloadCommon;
|
||||
|
||||
public class HelloUnload {
|
||||
private static String className = "CustomLoadee";
|
||||
// Prevent the following class from being GC'ed too soon.
|
||||
private static Class keptC = null;
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
if (args.length != 3) {
|
||||
throw new RuntimeException("Unexpected number of arguments: expected 3, actual " + args.length);
|
||||
if (args.length < 3) {
|
||||
throw new RuntimeException("Unexpected number of arguments: expected at least 3, actual " + args.length);
|
||||
}
|
||||
|
||||
String path = args[0];
|
||||
@ -62,9 +64,20 @@ public class HelloUnload {
|
||||
throw new RuntimeException("args[2] can only be either \"true\" or \"false\", actual " + args[1]);
|
||||
}
|
||||
|
||||
// The HelloDynamicCustom.java and PrintSharedArchiveAndExit.java tests
|
||||
// under appcds/dynamicArchive pass the keep-alive argument for preventing
|
||||
// the class from being GC'ed prior to dumping of the dynamic CDS archive.
|
||||
boolean keepAlive = false;
|
||||
if (args[args.length - 1].equals("keep-alive")) {
|
||||
keepAlive = true;
|
||||
}
|
||||
|
||||
URLClassLoader urlClassLoader =
|
||||
new URLClassLoader("HelloClassLoader", urls, null);
|
||||
Class c = Class.forName(className, true, urlClassLoader);
|
||||
if (keepAlive) {
|
||||
keptC = c;
|
||||
}
|
||||
System.out.println(c);
|
||||
System.out.println(c.getClassLoader());
|
||||
Object o = c.newInstance();
|
||||
|
||||
@ -25,9 +25,12 @@
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.HashMap;
|
||||
import sun.hotspot.WhiteBox;
|
||||
|
||||
public class OldClassApp {
|
||||
// Prevent the classes from being GC'ed too soon.
|
||||
static HashMap<String, Class> clsMap = new HashMap<>();
|
||||
public static void main(String args[]) throws Exception {
|
||||
String path = args[0];
|
||||
URL url = new File(path).toURI().toURL();
|
||||
@ -44,13 +47,26 @@ public class OldClassApp {
|
||||
throw new RuntimeException("args[1] can only be either \"true\" or \"false\", actual " + args[1]);
|
||||
}
|
||||
|
||||
// The OldClassAndInf.java test under appcds/dynamicArchive passes the keep-alive
|
||||
// argument for preventing the classes from being GC'ed prior to dumping of
|
||||
// the dynamic CDS archive.
|
||||
int startIdx = 2;
|
||||
boolean keepAlive = false;
|
||||
if (args[2].equals("keep-alive")) {
|
||||
keepAlive = true;
|
||||
startIdx = 3;
|
||||
}
|
||||
|
||||
URLClassLoader urlClassLoader =
|
||||
new URLClassLoader("OldClassAppClassLoader", urls, null);
|
||||
|
||||
for (int i = 2; i < args.length; i++) {
|
||||
for (int i = startIdx; i < args.length; i++) {
|
||||
Class c = urlClassLoader.loadClass(args[i]);
|
||||
System.out.println(c);
|
||||
System.out.println(c.getClassLoader());
|
||||
if (keepAlive) {
|
||||
clsMap.put(args[i], c);
|
||||
}
|
||||
|
||||
// [1] Check that class is defined by the correct loader
|
||||
if (c.getClassLoader() != urlClassLoader) {
|
||||
|
||||
@ -64,7 +64,7 @@ public class HelloDynamicCustom extends DynamicArchiveTestBase {
|
||||
"-Xlog:cds",
|
||||
"-Xlog:cds+dynamic=debug",
|
||||
"-cp", appJar,
|
||||
mainAppClass, customJarPath, "false", "false")
|
||||
mainAppClass, customJarPath, "false", "false", "keep-alive")
|
||||
.assertNormalExit(output -> {
|
||||
output.shouldContain("Written dynamic archive 0x")
|
||||
.shouldNotContain("klasses.*=.*CustomLoadee")
|
||||
|
||||
@ -49,7 +49,7 @@ public class LambdaCustomLoader extends DynamicArchiveTestBase {
|
||||
// 1. Host class loaded by a custom loader is initialized during dump time.
|
||||
dump(topArchiveName,
|
||||
"-Xlog:class+load,cds=debug,cds+dynamic",
|
||||
"-cp", appJar, mainClass, appJar, "init")
|
||||
"-cp", appJar, mainClass, appJar, "init", "keep-alive")
|
||||
.assertNormalExit(output -> {
|
||||
output.shouldMatch("Skipping.LambHello[$][$]Lambda[$].*0x.*:.Hidden.class")
|
||||
.shouldHaveExitValue(0);
|
||||
@ -67,7 +67,7 @@ public class LambdaCustomLoader extends DynamicArchiveTestBase {
|
||||
// 2. Host class loaded by a custom loader is NOT initialized during dump time.
|
||||
dump(topArchiveName,
|
||||
"-Xlog:class+load,cds=debug,cds+dynamic",
|
||||
"-cp", appJar, mainClass, appJar)
|
||||
"-cp", appJar, mainClass, appJar, "keep-alive")
|
||||
.assertNormalExit(output -> {
|
||||
output.shouldHaveExitValue(0);
|
||||
});
|
||||
|
||||
@ -80,7 +80,7 @@ public class OldClassAndInf extends DynamicArchiveTestBase {
|
||||
"-Xlog:cds",
|
||||
"-Xlog:cds+dynamic=debug",
|
||||
"-cp", appJar,
|
||||
mainAppClass, loadeesJar, inArchive),
|
||||
mainAppClass, loadeesJar, inArchive, "keep-alive"),
|
||||
loadees))
|
||||
.assertNormalExit(output -> {
|
||||
output.shouldContain("Written dynamic archive 0x")
|
||||
|
||||
@ -64,7 +64,7 @@ public class PrintSharedArchiveAndExit extends DynamicArchiveTestBase {
|
||||
"-Xlog:cds",
|
||||
"-Xlog:cds+dynamic=debug",
|
||||
"-cp", appJar,
|
||||
mainAppClass, customJarPath, "false", "false")
|
||||
mainAppClass, customJarPath, "false", "false", "keep-alive")
|
||||
.assertNormalExit(output -> {
|
||||
output.shouldContain("Written dynamic archive 0x")
|
||||
.shouldNotContain("klasses.*=.*CustomLoadee")
|
||||
|
||||
@ -54,7 +54,7 @@ public class RegularHiddenClass extends DynamicArchiveTestBase {
|
||||
|
||||
dump(topArchiveName,
|
||||
"-Xlog:class+load=debug,cds+dynamic,cds=debug",
|
||||
"-cp", appJar, mainClass)
|
||||
"-cp", appJar, mainClass, "keep-alive")
|
||||
.assertNormalExit(output -> {
|
||||
output.shouldMatch("cds.*Skipping.TestClass.0x.*Hidden.class")
|
||||
.shouldNotMatch("cds.dynamic.*Archiving.hidden.TestClass.*")
|
||||
|
||||
@ -28,6 +28,8 @@ import java.net.URLClassLoader;
|
||||
|
||||
public class CustomLoaderApp {
|
||||
private static String className = "LambHello";
|
||||
// Prevent the class from being GC'ed too soon.
|
||||
private static Class keptC = null;
|
||||
|
||||
public static void main(String args[]) throws Exception {
|
||||
String path = args[0];
|
||||
@ -37,13 +39,25 @@ public class CustomLoaderApp {
|
||||
System.out.println(url);
|
||||
|
||||
boolean init = false;
|
||||
if (args.length ==2 && args[1].equals("init")) {
|
||||
if (args.length >= 2 && args[1].equals("init")) {
|
||||
init = true;
|
||||
}
|
||||
|
||||
// The dynamicArchive/LambdaCustomLoader.java test passes the keep-alive
|
||||
// argument for preventing the class from being GC'ed prior to dumping of
|
||||
// the dynamic CDS archive.
|
||||
boolean keepAlive = false;
|
||||
if (args[args.length - 1].equals("keep-alive")) {
|
||||
keepAlive = true;
|
||||
}
|
||||
|
||||
URLClassLoader urlClassLoader =
|
||||
new URLClassLoader("HelloClassLoader", urls, null);
|
||||
Class c = Class.forName(className, init, urlClassLoader);
|
||||
if (keepAlive) {
|
||||
keptC = c;
|
||||
}
|
||||
|
||||
System.out.println(c);
|
||||
System.out.println(c.getClassLoader());
|
||||
if (c.getClassLoader() != urlClassLoader) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user