Understanding the -A and the -H flags

Simon Marlow marlowsd at gmail.com
Mon Feb 27 09:25:38 CET 2012

On 25/02/2012 16:51, Johan Tibell wrote:
> Hi!
> I'm trying to understand the interaction between the -A and -H RTS
> flags. The documentation at
>    http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/runtime-control.html
> says that if you use -H (with or without an argument) it implicitly
> implies some value of -A. However, it's not clear to me what value -A
> will get and how that value is related to the value of -H. For
> example, if I set the suggested heap size to 1G, using -H1G, surely
> the size of the nursery (-A) won't be "whatever is left over," but
> something more reasonable e.g. the size of the L2 cache?
> Perhaps it would make sense to document the actual algorithm used to
> set -A given -H (with and without argument.)

Hmm, I took a look at the docs and to me it seems clear (but it would 
do, since I wrote the docs :-)

"Think of -Hsize as a variable -A option. It says: I want to use at 
least size bytes, so use whatever is left over to increase the -A value."

Doesn't that describe exactly what it means?

Well, actually it's a bit more complicated than that, and there are some 
heuristics involved.  But the basic idea is to use all of the memory 
granted by -H for the heap, by increasing -A to fill any free space. 
The complications arise because we don't know how much of the nursery 
will need to be copied at the next GC, and the worst case (all of it) 
very often leaves a lot of memory unused, so we make an approximation. 
Sometimes this is an underestimate, and we end up using more memory than 
the -H value for a while.

Whether -H is a good idea is not clear.  When I added it, it was for 
backwards compatibilty with the previous GC, which had a fixed-size heap 
and required that you specify the heap size with -H.


More information about the Glasgow-haskell-users mailing list