[Mono-dev] Issues with GC due to libgc

pablosantosluac at terra.es pablosantosluac at terra.es
Mon Sep 28 15:05:41 EDT 2009


Hi all,

After several weeks working on a bunch of mem issues related to the
libgc based garbage collector, we've identified the following issue and
a possible solution (Dick already sent some workarounds to the list):

The libgc garbage collector has a really hard time identifying pointers
to objects since it "guesses" what is a pointer instead of actually
"knowing" by using data passed by the mono runtime.

It means something as simple as introducing a long on the stack (for
instance something like array = new int[1000000]) will block (forever)
the memory at address 1000000. Yes, as incredible as it sounds, it can
cause important mem problems on long living apps (typically servers).

(As a side note, this exact problem is present on sgen, since it also
scans the stack "conservatively").

A small improvement could be made in the current GC with little effort,
and is supplying more class refmaps to libgc.

Libgc is very hard to modify, it contains too many hacks and
optimizations that have made the code a nightmare to understand and
modify, so we don't find useful to make anything here beyond very small
patches.

That said, mono currently can provide reference bitmaps for objects,
it's a matter of providing the right descriptor to the garbage collector.

Libgc supports this kind of descriptors and mono already generates them
for the sgen gc, so it's just a matter of joining those together (which
should beeasy to do). This should improve a great number of scans in the
arking process, leaving only stacks and several minor objects without
precise marking. (Should become similar to the current sgen idea, where
stacks and other roots are scanned conservatively, although not compacting).

Attached is the sample code we use to reproduce the issue on 32 bit
based Linux/Mono systems.

Some notes about the test app below:


=======================================
the program accepts commands like gc, mem, exit, 2, or 1

2 n m       creates n arrays of ints with m elements, and put them in an
arraylist. After the call completes, they are no longer referenced.
1 n m       same, but waiting for a key press after each new array
gc n         performs n gcs
exit         exits

So, the case:

mono test.exe
> 2 2000000 70            creates 2 million int arrays of 70 elements
each (virtual goes up to 777MB)
> gc 10                        should free everything, but around 33MB
remain allocated acording to pmap:

...
bf4b5000     32K      0K      0K ---p [anon]
bfc9e000     88K     32K     28K rwxp [stack]
ffffe000      4K      0K      0K r-xp [vdso]
Total:   777820K  33852K  29336K


> 2 20 25000000          creates 20 int arrays of 25 million elements
each (2.7GB)
> gc 10                         now pmap shows everything is screwed up:

...
b7f2b000      8K      8K      8K rwxp /lib/ld-2.6.1.so
bf4b5000     32K      0K      0K ---p [anon]
bfc9e000     88K     32K     28K rwxp [stack]
ffffe000      4K      0K      0K r-xp [vdso]
Total:   2764356K 1696132K 1691616K


Trying with smaller sizes lets you see that segments are joined and
split, but seems that there is some inability to free everything.

======================================


Regards,


	pablo



-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: Program.cs
Url: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20090928/8d4f1de6/attachment.pl 


More information about the Mono-devel-list mailing list