Memory leak

Behdad Esfahbod behdad-26n5VD7DAF2Tm46uYYfjYg at public.gmane.org
Mon Dec 12 16:15:22 UTC 2005


A good read about these issues:

  http://live.gnome.org/MemoryReduction


On Mon, 12 Dec 2005, it was written:

> On Mon, 12 Dec 2005, Lennart Sorensen wrote:
>
> > On Sun, Dec 11, 2005 at 12:56:41PM -0500, billt-lxSQFCZeNF4 at public.gmane.org wrote:
>
> > > Detecting it is really a matter of running the application
> > > and noticing that it is using more and more memory as time
> > > goes on. There are some compilers that try to detect it but
> > > to my knowledge there is no full proof way doing that.
>
> Note that if the so-called size of the process keeps increasing
> over time, it does not necessarily mean that the application is
> leaking.  That's in fact a known phenamenon about Firefox.  The
> problem is that malloc() implementation for not-so-large pieces
> of memory (like < 4kb) uses the heap for allocation.  If there's
> not enough space available in the heap, it will use the system
> call brk(2) to increase the size of the heap of the process.  Now
> note that the heap is a linear chunk in the address space of the
> process, it grows at the end, and shrink at the end.  So at
> free() time, if a minimum of memory at the *end* of the heap is
> free, it will be returned to the system, reducing the size of the
> process.
>
> Now consider the following situation: you open a bunch of very
> very long pages in Firefox.  All the laying out of text,
> javascripts, etc, eats up a good 100MB of your memory, so the
> firefox process grows to something like 120MB.  Now you open a
> tab, loading a very small page in it.  The memory allocations for
> this small page most probably happen to be after the 100MB
> allocations for your long pages.  Now you close all the long
> pages, the memory they have allocated using malloc() is free()d
> and returned to the libc, but since the memory for the small page
> is not free()d yet, you have some allocated memory at the end of
> your heap, which has a good 101MB of size now.  So even though
> Firefox have free()d 100MB of the 101MB, it will *not* be
> returned to the system and the size of the firefox process will
> remain around 121MB.
>
> Now this is not the end of the story, there's the issue of
> fragmentation too.  Left as an exercise.
>
> There are several attempts to fix these problems.  The recent
> g_slice allocated in glib is one of them:
>
>   http://www.mail-archive.com/gtk-devel-list-rDKQcyrBJuzYtjvyW6yDsg@public.gmane.org/msg01723.html
>
> The idea behind this and other similar allocators is that instead
> of allocating from the heap, the serve memory allocations of the
> same size from a small pool allocated specifically for slices of
> that range of size.  These pools on the other hand, are around a
> pagesize (4kb) in size and so are allocated using mmap(2), not
> brk(2).  mmap()ed allocations can be freed and returned to system
> at any time, unlike heap memory.
>
>
> > I remember using purify at university on solaris a few times.
> > It is absolutely amazing for doing such things (and other array
> > bounds checks and such).  It appears it is now available for
> > linux, and is only about $8000 per license. :)
>
> Valgrind is an amazing Free Software project doing along the same
> lines as purify.
>
>
> --behdad
> http://behdad.org/
>
> "Commandment Three says Do Not Kill, Amendment Two says Blood Will Spill"
> 	-- Dan Bern, "New American Language"
> --
> The Toronto Linux Users Group.      Meetings: http://tlug.ss.org
> TLUG requests: Linux topics, No HTML, wrap text below 80 columns
> How to UNSUBSCRIBE: http://tlug.ss.org/subscribe.shtml
>
>

--behdad
http://behdad.org/

"Commandment Three says Do Not Kill, Amendment Two says Blood Will Spill"
	-- Dan Bern, "New American Language"
--
The Toronto Linux Users Group.      Meetings: http://tlug.ss.org
TLUG requests: Linux topics, No HTML, wrap text below 80 columns
How to UNSUBSCRIBE: http://tlug.ss.org/subscribe.shtml





More information about the Legacy mailing list