This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Why does this program cause an NPE in LibgcjInternalFinalizerThread??


Tom Tromey wrote:

"David" == David Daney <ddaney@avtrex.com> writes:



David> I am still trying to find the cause of a problem I am having. David> This program seems to make libgcj unhappy.

David> System configuration linux x86 (RedHat 7.1) w/ kernel 2.4.20
David> and gcj 3.3.1

I tried this on x86 Red Hat Linux 9, using the current trunk gcj.

Mostly it seems to hang, occasionally it works fine.

gdb isn't being much help; can't get a backtrace.

Tom

new program:

We get similar behavior (perhaps identical) with our mipsel-linux-gcj. It is the same problem I posted several days ago.

Using a massivly instrumented version of natReference.cc I think that what is happening is this:

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 added checksum and magic fields to object_list, and check the integrity of the hash structure before and after each operation. Although I am not positive, I think that the hash structure is not changing. 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.

I have not duplicated my tests with an x86 build, but since the behavior is (close to) identical, it seems plausable that the cause is the same.

Dave.

new program:

-----------------------------------------
import java.lang.ref.*;

public class Reftest {
   public void run(int id)
   {
       Reference r;
       for (int i=0; i<10000; i++) {
           r = new SoftReference("SoftReference Id "+id + ' ' + i);
           r = new WeakReference("WeakReference Id "+id + ' ' + i);
           // Different mod values cause either good or bad operation
           // 250 seems to be bad, 200 seems to be good.
           if(0 == i% 250) {
               System.out.println("Id: " + id + "  i = " + i);
               System.gc();
               System.runFinalization();
               System.gc();
               System.runFinalization();
           }
       }
       System.out.println("iteration "+id+" finishing");
   }

   public Reftest() {
   }

public static void main(String[] args) {
System.setProperty("gnu.gcj.runtime.NameFinder.use_addr2line", "false");
System.setProperty("gnu.gcj.runtime.NameFinder.sanitize", "false");
System.setProperty("gnu.gcj.runtime.NameFinder.remove_unknown", "false");
for (int i = 0; i<20; i++) {
Reftest reftest1 = new Reftest();
reftest1.run(i+1);
}
}
}
--------------------------------------------------------------






Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]