Finding memory leaks

Andrew Haley aph@redhat.com
Sat Feb 28 19:36:00 GMT 2004


Rutger Ovidius writes:
 > 
 > On Monday, February 23, 2004, Thomas Aeby wrote:
 > 
 > > I'm trying to find memory leaks in one of my Java programs. So far I
 > > have tried adding a small native C routine just using GC_* calls in
 > > order to dump out a list of objects in use and added a little Perl
 > > program taking this list, finding the associated classes' names and
 > > printing some statistics. Rather than the expected "oh, I get increasing
 > > numbers of class X instances" I see huge numbers of objects I cannot
 > > find any reason why they shouldn't be collected by the garbage
 > > collector (like e.g. FileInputStream/FileDescriptor objects, byte[] and
 > > char[] arrays, Date stuff, etc. which are mostly allocated/valid in a
 > > local block only).
 > 
 > I'd be very interested to hear what you find out, if anything.
 > 
 > Does your app collect properly with sun's java?
 > 
 > My app runs fine in sun's java; all objects are properly collected. But in
 > gcj it seems like it doesn't feel like collecting all objects so memory
 > leaks until there is no memory left.
 > 
 > I don't know how to narrow this problem down (trying to write simple test
 > cases just isn't working out), and it is _very_ frustrating.
Does a trivial app (concatenate a ton of strings, throw a way the
result, loop) collect OK for you? It does for me.
public class gc
{
 static public void main (String[] s)
 {
	for (int i=0; i<100000; i++)
	 {
		String zz = " ";
		for (int j=0; j<20; j++)
		 zz += zz;
	 }
 }
}
There is always a risk that because of conservative collection we're
incorrectly marking a few objects, but that doesn't sound exactly like
the problem you're having.
I've been thinking about this. What we really need is a mode that
prints out every object found during the sweep in such a way that you
can see how everything has been reached.
Andrew.


More information about the Java mailing list

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