test/java/io/Serializable/clearHandleTable/ClearHandleTable.java

Print this page

        

*** 28,66 **** */ import java.io.*; import java.lang.ref.WeakReference; import java.util.ArrayList; public class ClearHandleTable { public static void main(String[] args) throws Exception { final int nreps = 100; ObjectOutputStream oout = new ObjectOutputStream(new ByteArrayOutputStream()); ! WeakReference[] refs = new WeakReference[nreps]; for (int i = 0; i < nreps; i++) { String str = new String("blargh"); oout.writeObject(str); ! refs[i] = new WeakReference(str); } oout.reset(); - exhaustMemory(); ! for (int i = 0; i < nreps; i++) { ! if (refs[i].get() != null) { ! throw new Error("failed to garbage collect object " + i); ! } ! } } ! static void exhaustMemory() { ! ArrayList blob = new ArrayList(); ! try { ! for (;;) { ! blob.add(new int[0xFFFF]); ! } ! } catch (OutOfMemoryError e) { } } } --- 28,77 ---- */ import java.io.*; import java.lang.ref.WeakReference; import java.util.ArrayList; + import java.util.Iterator; + import java.util.List; public class ClearHandleTable { + private static final int TIMES = 1000; + public static void main(String[] args) throws Exception { final int nreps = 100; ObjectOutputStream oout = new ObjectOutputStream(new ByteArrayOutputStream()); ! List<WeakReference<?>> refs = new ArrayList<>(nreps); for (int i = 0; i < nreps; i++) { String str = new String("blargh"); oout.writeObject(str); ! refs.add(new WeakReference<Object>(str)); } oout.reset(); ! int count = 0; ! for (int i=0; i<TIMES; i++) { ! // relying on, possibly multiple, System.gc calls to clear weak references ! System.gc(); ! ! Iterator<WeakReference<?>> itr = refs.iterator(); ! while(itr.hasNext()) { ! WeakReference<?> ref = itr.next(); ! if (ref.get() == null) { ! itr.remove(); ! } ! } ! if (refs.isEmpty()) ! break; ! Thread.sleep(20); ! count++; ! if (count % 10 == 0) ! System.out.println("Looping " + count + " times"); } ! if (!refs.isEmpty()) { ! throw new Error("failed to garbage collect object"); } } }