< prev index next >

test/hotspot/jtreg/runtime/HiddenClasses/GCHiddenClass.java

Print this page




  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 }
< prev index next >