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 } |