GC leaks debugging
Andrew Haley
aph@redhat.com
Fri Apr 8 13:56:00 GMT 2011
On 04/07/2011 06:42 PM, Erik Groeneveld wrote:
> Thanks for trying.
>
> The last good dump I have from the test after 12 million cycles (it
> then got killed) has nothing like File stuff at all. A also saw other
> suspicious objects, but they all disappeared later on. The collecter
> really works wel!
>
> See dump extract below (full dump attached).
>
> What can you suggest from this?
> What does (Java) mean?
I'm not exactly sure. This will take a bit of digging.
> *** Memory Usage Sorted by Total Size ***
>
> Total Size Count Size Description
> -------------- ----- -------- -----------------------------------
> 17% 3,958,024 = 70,679 * 56 - (Java)
> 15% 3,426,048 = 71,376 * 48 - GC_PTRFREE
> 9% 2,097,152 = 1 * 2,097,152 - GC_NORMAL
> 9% 2,085,160 = 7 * 297,880 - [I
> 8% 1,908,240 = 79,510 * 24 - (Java)
> 6% 1,376,928 = 42 * 32,784 - [C
> 5% 1,279,104 = 79,944 * 16 - (Java)
> 4% 1,048,592 = 1 * 1,048,592 - [I
> 4% 954,480 = 19,885 * 48 - GC_NORMAL
> 4% 917,952 = 28 * 32,784 - [B
> 2% 642,896 = 2 * 321,448 - [I
> 2% 622,896 = 19 * 32,784 - [I
> 1% 355,840 = 8,896 * 40 - (Java)
>
>> At a mad guess, someone is not closing their files but
>> hoping that finalization will do it instead.
>
> It crossed my mind also, but I see no traces of that.
>
> Next hypothesis:
> From analyzing graphs from the logs and comparing them to those of the
> OpenJDK, I get the feeling that the collector looses control by not
> collecting often enough.
>
> The heap is quite unused/free, and remains so during the process. It
> seems that at some point, the heap fills up very quickly, and then the
> collector decides to expand the heap instead of collecting (the
> algorithm for deciding this seems rather complicated). However, a
> larger heap also causes the collector to collect less frequently. So
> the next time the heap fills up rapidly, it again decides to expand
> the heap, again causing less frequent collections. And so on. I´ll
> post the graph data in a separate post if you want it.
That makes sense as an explanation.
It looks, then, as though there isn't a leak at all. The collector
does what it's supposed to do. There is always the risk of this with
any non-compacting dynamic memory allocator.
> And the next hypothesis:
> Perhaps the program allocates many different (possibly large) sizes,
> which remain on the free list, but cannot be used because the next
> objects requested are slightly bigger. I have to study this somewhat
> more.
I wonder.
> Just two questions:
> 1. What is a reasonable number of heap sections? I have 131 here.
> 2. What is a reasonable number of free lists? I have 60, which have
> 13,000+ entries.
Paging Hans Boehm. can you suggest ways to get the system to GC more
frequently? Would doing so avoid this scenario?
Andrew.
More information about the Java
mailing list