jdk/test/java/io/Serializable/clearHandleTable/ClearHandleTable.java
changeset 29271 162fe03153a4
parent 5506 202f599c92aa
equal deleted inserted replaced
29270:0f65e3c44659 29271:162fe03153a4
    28  */
    28  */
    29 
    29 
    30 import java.io.*;
    30 import java.io.*;
    31 import java.lang.ref.WeakReference;
    31 import java.lang.ref.WeakReference;
    32 import java.util.ArrayList;
    32 import java.util.ArrayList;
       
    33 import java.util.Iterator;
       
    34 import java.util.List;
    33 
    35 
    34 public class ClearHandleTable {
    36 public class ClearHandleTable {
       
    37     private static final int TIMES = 1000;
       
    38 
    35     public static void main(String[] args) throws Exception {
    39     public static void main(String[] args) throws Exception {
    36         final int nreps = 100;
    40         final int nreps = 100;
    37         ObjectOutputStream oout =
    41         ObjectOutputStream oout =
    38             new ObjectOutputStream(new ByteArrayOutputStream());
    42             new ObjectOutputStream(new ByteArrayOutputStream());
    39         WeakReference[] refs = new WeakReference[nreps];
    43         List<WeakReference<?>> refs = new ArrayList<>(nreps);
    40 
    44 
    41         for (int i = 0; i < nreps; i++) {
    45         for (int i = 0; i < nreps; i++) {
    42             String str = new String("blargh");
    46             String str = new String("blargh");
    43             oout.writeObject(str);
    47             oout.writeObject(str);
    44             refs[i] = new WeakReference(str);
    48             refs.add(new WeakReference<Object>(str));
    45         }
    49         }
    46 
    50 
    47         oout.reset();
    51         oout.reset();
    48         exhaustMemory();
       
    49 
    52 
    50         for (int i = 0; i < nreps; i++) {
    53         int count = 0;
    51             if (refs[i].get() != null) {
    54         for (int i=0; i<TIMES; i++) {
    52                 throw new Error("failed to garbage collect object " + i);
    55             // relying on, possibly multiple, System.gc calls to clear weak references
       
    56             System.gc();
       
    57 
       
    58             Iterator<WeakReference<?>> itr = refs.iterator();
       
    59             while(itr.hasNext()) {
       
    60                 WeakReference<?> ref = itr.next();
       
    61                 if (ref.get() == null) {
       
    62                     itr.remove();
       
    63                 }
    53             }
    64             }
       
    65             if (refs.isEmpty())
       
    66                 break;
       
    67             Thread.sleep(20);
       
    68             count++;
       
    69             if (count % 10 == 0)
       
    70                 System.out.println("Looping " + count + " times");
    54         }
    71         }
    55     }
       
    56 
    72 
    57     static void exhaustMemory() {
    73         if (!refs.isEmpty()) {
    58         ArrayList blob = new ArrayList();
    74             throw new Error("failed to garbage collect object");
    59         try {
       
    60             for (;;) {
       
    61                 blob.add(new int[0xFFFF]);
       
    62             }
       
    63         } catch (OutOfMemoryError e) {
       
    64         }
    75         }
    65     }
    76     }
    66 }
    77 }