Why does this program cause an NPE in LibgcjInternalFinalizerThread ??

Jeff Sturm jsturm@one-point.com
Wed Aug 20 00:33:00 GMT 2003


On Tue, 19 Aug 2003, David Daney wrote:
> The object_list.reference is pointing to either a WeakReference or a
> SoftReference.  At some as yet unknown point it points something other
> than one of these, causing a crash usually when ref->enqueue() is called
> because the vtable of the object is not a Reference vtable.

I can see this on x86 with your first test program.  The crash occurs
on line 253:

250               // If the copy is already NULL then the user must have
251               // called Reference.clear().
252               if (ref->copy != NULL)
253                 ref->enqueue ();

> My current thought is that the WeakReference is being GCed
> and its space is then given to a new object (probably a String with this
> test program) and now the object_list.reference pointer is pointing to
> the new object rather than the WeakReference.

Sounds plausible.  gdb doesn't let me print the "ref" variable
directly, however the only register I have that looks like a heap pointer
is $eax:

(gdb) x $eax
0x8180c78:      0x407f1568
(gdb) x 0x407f1568
0x407f1568 <_ZTVN4java4lang6StringE+8>: 0x407f15a0

which clearly has a java.lang.String vtable.

What I don't understand is why finalize_reference doesn't prevent this
from happening.  The ref cannot be GC'ed before finalize_reference is
called, and after it is called it is explicitly removed from the hash
table.

Jeff



More information about the Java mailing list