ghc releasing memory during compilation

Simon Marlow simonmarhaskell at
Tue Mar 21 08:44:38 EST 2006

Bulat Ziganshin wrote:

> and moreover, we should perform compaction immediately when swapping grows.
> imagine for example algorithm that had 80 mb residency and runs on a
> machine with 100 mb free. performing compacting GC each time when
> memory usage grows to 100 mb should be better strategy than waiting
> for 160 mb usage. of course, concrete calculation whether to start GC
> or not, is a delicate task, but at least it should be performed on
> each minor GC

I'd like to urge you to have a go at implementing some of these 
strategies.  The code is fairly readable, most of the auto-tuning of GC 
happens at the top level of GarbageCollect() in GC.c.  The main 
complexities are due to handling the difference between -H and no -H, 
and the fact that a 1-generation setup is quite different from a 
2-or-more-generation collector.

> 4. i still don't understand - wgen GHC performs copying GC, whether it
> copies data from old pages sequential or not? if it releases old pages
> sequentially, we can run copying GC using the same amount of physical ram
> as required for compaction gc

I think you're a bit confused about how copying GC works.  Only when the 
graph has been fully traversed can the old from-space area be discarded; 
until then, there might be live objects anywhere in it.  Furthermore, 
GHC's block allocation layer means that memory fragmentation can prevent 
freeing of unused memory: memory can only be freed in units of 
MegaBlocks (1Mb), but a megablock cannot be freed unless it has no 
active blocks in it.  (see my earlier reply to Duncan about this). 
Regardless of this, madvise()-style freeing can always be used.


More information about the Glasgow-haskell-users mailing list