Heap fragmentation (Was: Debugging "Leaks" With Boehm-GC)

Martin Egholm Nielsen martin@egholm-nielsen.dk
Sun Jan 15 00:46:00 GMT 2006


Hi Daney,
>>>> We are currently experiencing some dire difficulties with one of 
>>>> GCJ's most opaque aspects - garbage collection.
>>>>>>>> The application exhibiting "leaks" is an XML browser of our own 
>>>> creation. The use case that "leaks" is one where our browser 
>>>> software works its way through interpreting some page elements, and 
>>>> then throws an "event", which is implemented by throwing a Java 
>>>> exception, which something up the stack elements then catches. The 
>>>> software works beautifully, except it "leaks".
>>>>>> The boehm GC in certain circumstances suffers from memory 
>>> fragmentation. When this happens, even though there may be 'free' 
>>> memory, it cannot be used so the GC must try to obtain more memory 
>>> from the OS.
>>>>>> The solution we found was to increase the GC_free_space_divisor (to a 
>>> value of 20). Using this in conjunction with calling 
>>> _Jv_SetMaximumHeapSize() to set the maximum heap size gives us very 
>>> good results (A fixed heap size that never fills up). There is a 
>>> trade off in increasing the GC_free_space_divisor, in that it 
>>> increases the frequency of GC events with results in reduced 
>>> performance.
>>>> Just stumpled across this old thread - seems that I'm beginning to run 
>> into fragmentation problems - bot being able to allocate memory for 
>> some things.
>> I have set GC_MAXIMUM_HEAP_SIZE to 14000000 (14mb), but I wonder where 
>> I can configure GC_free_space_divisor? In "alloc.c" it seems - but 
>> there it's set to 3, whereas "gc.h" says it's initially 4?!
>>> We set GC_free_space_divisor before calling JvRunMain. I don't know 
> what happens if you call it after the runtime is already started.
But where is it configured? I will look for it in the morrow - if it's a 
matter of searching for "GC_set_free_space_divisor" in the libjava 
folder, I'm on it ;-)
>> Moreover, is 20 a super value? Or is this trial-and-error?
 >
> Trial and error.
Bummer :-)
> The larger the divisor, the more time spent in GC, but the less likely 
> you are to end up in the pathological situation where there is plenty of 
> free memory, but it is all in pools for objects of a size other than you 
> are trying to allocate.
Exactly - I have plenty of mem free (>5 megs out of 14), but no way to 
use it :-)
> I think the default value is probably appropiate for cases where there 
> is no upper bound on memory size. For bounded memory size, we have 
> found that a larger divisor is needed.
I'm just glad the posibility it's there
// Martin


More information about the Java mailing list

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