Possible WeakReference Bug

Jesse Rosenstock jmr@ugcs.caltech.edu
Mon Nov 18 12:43:00 GMT 2002


I think I may have found a bug with WeakReference, but I want to make sure
I understand how they're supposed to work before I submit a PR.
It seems that the WeakReference is being enqueued even though the
referent is still live and WeakReference.get() returns non-null.
The program is below. It prints:
Hmm, reclaimed 13/127 @ iter 13
enqueued, but still alive @ index 127
13/127
Hmm, reclaimed 13/129 @ iter 13
enqueued, but still alive @ index 129
13/129
Hmm, reclaimed 13/106 @ iter 13
enqueued, but still alive @ index 106
13/106
...
Is this a bug, or am I misunderstanding WeakReferences? Also, it seems
that the finalizer is never called, is that expected?
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
public class WeakRefTest {
 private static final class Cookie {
 final String s;
 final int i;
 public Cookie(String s, int i) {
 this.s = s;
 this.i = i;
 }
 public String toString() {
 return s;
 }
 public void finalize() {
 // System.out.println("finalizing " + s);
 }
 }
 private static boolean GC = false;
 public static void main(String[] args) {
 if (GC)
 System.gc();
 for (int i = 0; i < 100; ++i) {
 final Cookie[] cs = new Cookie[1000];
 final WeakReference[] ws = new WeakReference[cs.length];
 final ReferenceQueue q = new ReferenceQueue();
 for (int j = 0; j < cs.length; ++j) {
 String s = "" + i + "/" + j;
 cs[j] = new Cookie(s, j);
 ws[j] = new WeakReference(cs[j], q);
 }
 if (GC)
 System.gc();
 Reference r;
 while ((r = q.poll()) != null) {
 Cookie c = (Cookie) r.get();
 System.err.println("Hmm, reclaimed " + c + " @ iter " + i);
 if (cs[c.i] == c) {
 System.err.println("enqueued, but still alive @ index "
 + c.i);
 System.err.println(ws[c.i].get());
 } else {
 System.err.println("not found, where did it go?");
 }
 }
 if (GC)
 System.gc();
 }
 }
}


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /