GHC-9.0 is too reluctant to return memory with non-copying collectors
On the ghc-9.0 branch the rts is too reluctant to return memory to the OS. See https://gitlab.haskell.org/ghc/ghc/-/blob/ghc-9.0/rts/sm/GC.c#L953:
need = need_prealloc + (RtsFlags.GcFlags.oldGenFactor + 2) * need_live;
This always keeps (F + 2)*Live
memory, yet if we are using the non-moving or compacting collectors then (F+1.2)*Live
should be enough.
This was fixed by afc357d2, which also introduces the -Fd
flag. As this added a feature it wasn't backported. Yet, I think the part of this commit that fixes this coefficient should be backported to the 9.0 line.