[GHC] #13110: GHC API allocates memory which is never GC'd
GHC
ghc-devs at haskell.org
Thu Jan 12 00:00:45 UTC 2017
#13110: GHC API allocates memory which is never GC'd
-------------------------------------+-------------------------------------
Reporter: DanielG | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: GHC API | Version: 8.0.1
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
I've run into a very strange sort of memory leak it seems. GHC seems to
manage to allocate memory which I cannot get rid of no matter what I try
even after all references have disappeared. The allocated memory doesn't
show up in heap profiles but is still visibly allocated (as seen in ps or
pmap).
I discovered this while investigating reports of large memory usage in
ghc-mod where this issue is forcing us to dump completion information in a
separate process to avoid the allocated memory sticking around for the
rest of the user's session.
The attached test case demonstrates this problem by first calling
`getModuleInfo` for all modules in all visible packages and then just
looping forever in `main`. I would expect all memory GHC allocated to be
GC'd at this point but this does not happen.
When run as
{{{
$ ./Leaky -hide-all-packages
}}}
the test case consumes around 30M of memory on my system, if we however
load some large package, say GHC itself
{{{
$ ./Leaky -hide-all-packages -package ghc
}}}
the program will consume around 2-300M of memory which are never
deallocated. The behaviour is not related to the loaded package though I
tried it with `Cabal` too with the same result though smaller memory
usage.
At first I thought this might be related to large CAFs with IORefs inside
not being GCd for some reason so I tried calling `resetCAFs` from the RTS
before entering the loop. This however makes no difference whatsoever. I
also tried forcing a major GC just to be save to no avail.
Next I speculated that maybe the allocated memory is beyond the GC's
control (malloc()ed or something) but looking at the memory map of the
process with `pmap $(pgrep Leaky)` that the majority of the memory usage
I'm seeing comes from address `0x0000000200000000` which is where the RTS
allocates memory AFAIK.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13110>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list