[Geany-devel] Geany memory behavior "suspected memory leak - ID: 3415254" - g_slice

Nick Treleaven nick.treleaven at xxxxx
Fri Oct 14 14:24:44 UTC 2011


On 14/10/2011 04:09, Lex Trotman wrote:
> Hi All,
>
> I have been investigating bug report "suspected memory leak - ID:
> 3415254"

http://sourceforge.net/tracker/?func=detail&atid=787791&aid=3415254&group_id=153444

> 1. each time all files are closed only 200k is returned to the OS, but
> since the first open uses 22.8Mb but later ones less, Geany isn't
> leaking all of it, it is being held by the allocators.
>
> 2. ignoring the first open, the amount of extra memory used to open
> all the files varied from 0.4Mb to 2.9Mb.  Average 1.1Mb or 5% of the
> initial 22.8Mb and standard deviation of 0.665Mb or 3% of the 22.8Mb.
>
> 3. Simple leaks are unlikely to cause the large deviation in the
> memory increase, each open of the same set of files would tend to leak
> the same amount.  It is therefore likely that fragmentation effects
> cause the large deviation, but it may not be the whole cause of the
> increase.
>
> Since Geany uses three different allocators, each of which has
> differing policies for holding onto memory, it is going to be
> difficult to separate real leaks from allocator effects.

Interesting.

I'd like to continue the discussion from the report about allocator usage:

Lex:
"I think probably most of the fragmentation is due to having three
allocators in use, libc, Glib and libc++, and they not sharing or 
returning memory they acquire. This is likely to outweigh the 
cost/benefit of switching to g_slice given the effort required since 
types or sizes are needed in all frees."

Firstly, we already are using g_slice quite a lot - probably the most 
useful place is for allocating TMTag structures. Obviously GLib uses it 
internally.

Secondly, see:
http://developer.gnome.org/glib/2.28/glib-Memory-Slices.html#glib-Memory-Slices.description

"This is accompanied by extra caching logic to keep freed memory around 
for some time before returning it to the system."

Thirdly, GLib recommends using g_slice for fixed size allocations, and 
IIUC g_slice completely prevents fragmentation, besides being faster 
(anecdotally about 2x).

I don't know if converting our other uses of g_new for fixed size 
structures is worth it, but I would say it is good practice to use 
g_slice in all new code.



More information about the Devel mailing list