37 import java.lang.ref.PhantomReference;
38 import java.lang.ref.Reference;
39 import java.lang.ref.ReferenceQueue;
40
41 import static java.lang.invoke.MethodHandles.Lookup.ClassOption.*;
42 import jdk.test.lib.compiler.InMemoryJavaCompiler;
43
44 // This test is based on test vmTestbase/vm/mlvm/anonloader/func/isGarbageCollected/Test.java
45 public class GCHiddenClass {
46
47 static byte klassbuf[] = InMemoryJavaCompiler.compile("TestClass",
48 "public class TestClass { " +
49 " public TestClass() { " +
50 " System.out.println(\"Hello\"); " +
51 " } } ");
52
53 // A private method is great to keep hidden Class reference local to make it
54 // GCed on the next cycle
55 private PhantomReference<Class<?>> createClass(ReferenceQueue<Class<?>> refQueue) throws Exception {
56 Lookup lookup = MethodHandles.lookup();
57 Class<?> cl = lookup.defineHiddenClass(klassbuf, false, NESTMATE, WEAK).lookupClass();
58 return new PhantomReference<Class<?>>(cl, refQueue);
59 }
60
61 public boolean run() throws Exception {
62 ReferenceQueue<Class<?>> refQueue = new ReferenceQueue<Class<?>>();
63 PhantomReference<Class<?>> hiddenClassRef = createClass(refQueue);
64 System.gc();
65 Reference<? extends Class<?>> deletedObject = refQueue.remove();
66 return hiddenClassRef.equals(deletedObject);
67 }
68
69 public static void main(String[] args) throws Throwable {
70 GCHiddenClass gcHC = new GCHiddenClass();
71 if (!gcHC.run()) {
72 throw new RuntimeException("Test failed");
73 }
74 }
75 }
|
37 import java.lang.ref.PhantomReference;
38 import java.lang.ref.Reference;
39 import java.lang.ref.ReferenceQueue;
40
41 import static java.lang.invoke.MethodHandles.Lookup.ClassOption.*;
42 import jdk.test.lib.compiler.InMemoryJavaCompiler;
43
44 // This test is based on test vmTestbase/vm/mlvm/anonloader/func/isGarbageCollected/Test.java
45 public class GCHiddenClass {
46
47 static byte klassbuf[] = InMemoryJavaCompiler.compile("TestClass",
48 "public class TestClass { " +
49 " public TestClass() { " +
50 " System.out.println(\"Hello\"); " +
51 " } } ");
52
53 // A private method is great to keep hidden Class reference local to make it
54 // GCed on the next cycle
55 private PhantomReference<Class<?>> createClass(ReferenceQueue<Class<?>> refQueue) throws Exception {
56 Lookup lookup = MethodHandles.lookup();
57 Class<?> cl = lookup.defineHiddenClass(klassbuf, false, NESTMATE).lookupClass();
58 return new PhantomReference<Class<?>>(cl, refQueue);
59 }
60
61 public boolean run() throws Exception {
62 ReferenceQueue<Class<?>> refQueue = new ReferenceQueue<Class<?>>();
63 PhantomReference<Class<?>> hiddenClassRef = createClass(refQueue);
64 System.gc();
65 Reference<? extends Class<?>> deletedObject = refQueue.remove();
66 return hiddenClassRef.equals(deletedObject);
67 }
68
69 public static void main(String[] args) throws Throwable {
70 GCHiddenClass gcHC = new GCHiddenClass();
71 if (!gcHC.run()) {
72 throw new RuntimeException("Test failed");
73 }
74 }
75 }
|