Opened 5 months ago

Closed 4 months ago

Last modified 4 months ago

#15111 closed bug (fixed)

GHCi leaks the first modules loaded

Reported by: simonmar Owned by: simonmar
Priority: normal Milestone: 8.6.1
Component: Compiler Version: 8.2.2
Keywords: ghci Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s): Phab:D4658 Phab:D4659
Wiki Page:

Description

How to reproduce the leak:

cd nofib/real/veritas
ghci +RTS -S
Prelude> :load Main
*Main> System.Mem.performGC
 10554832  32639712  38824584  0.048  0.058    2.317    8.386    0    0  (Gen:  1)

Live data is ~38Mb (3rd number). Now unload everything:

*Main> :load
Prelude> System.Mem.performGC
  4005376  32681280  38850224  0.013  0.048    2.330   29.896    0    0  (Gen:  1)

Note the live data didn't go down.

Load the program again:

Prelude> :load Main
...
*Main> System.Mem.performGC
 16344112  47790304  54799632  0.070  0.074    4.343   82.235    0    0  (Gen:  1)

Note the live memory is almost 2x what it was before.

Change History (7)

comment:1 Changed 5 months ago by simonmar

Owner: set to simonmar

comment:2 Changed 5 months ago by simonmar

Differential Rev(s): Phab:D4658,Phab:D4659

comment:3 Changed 5 months ago by simonmar

Differential Rev(s): Phab:D4658,Phab:D4659Phab:D4658 Phab:D4659

comment:4 Changed 4 months ago by Simon Marlow <marlowsd@…>

In 5fe6aaa/ghc:

Add -fghci-leak-check to check for space leaks

Summary:
Space leaks in GHCi emerge from time to time and tend to come back again
after they get fixed. This is an attempt to limit regressions by

* adding a reliable detection for some classes of space leaks in GHCi
* turning on leak checking for all GHCi tests in the test suite, so that
  we'll notice if the leak appears again.

The idea for detecting space leaks is quite simple:

* find some data that we expect to be GC'd later, make a weak pointer to it
* when we expect the data to be dead, do a `performGC` and then check
  the status of the weak pointer.

It would be nice to apply this trick to lots of things in GHC,
e.g. ensuring that HsSyn is not retained after the desugarer, or
ensuring that CoreSyn from the previous simplifier pass is not retained.

Test Plan: validate

Reviewers: bgamari, simonpj, erikd, niteria

Subscribers: thomie, carter

GHC Trac Issues: #15111

Differential Revision: https://phabricator.haskell.org/D4658

comment:5 Changed 4 months ago by Simon Marlow <marlowsd@…>

In f27e4f6/ghc:

Fix GHCi space leaks (#15111)

Summary:
There were a number of leaks causing previously loaded modules to be
retained after a new `:load`.  This fixes enough leaks to get the
tests to pass from D4658.

Test Plan: See new tests in D4658

Reviewers: niteria, bgamari, simonpj, erikd

Subscribers: thomie, carter

GHC Trac Issues: #15111

Differential Revision: https://phabricator.haskell.org/D4659

comment:6 Changed 4 months ago by simonmar

Resolution: fixed
Status: newclosed

comment:7 Changed 4 months ago by Simon Marlow <marlowsd@…>

In 5b6ef59/ghc:

Add -fghci-leak-check to check for space leaks

Summary:
(re-applying this patch now that D4659 is committed)

Space leaks in GHCi emerge from time to time and tend to come back again
after they get fixed. This is an attempt to limit regressions by

* adding a reliable detection for some classes of space leaks in GHCi
* turning on leak checking for all GHCi tests in the test suite, so that
  we'll notice if the leak appears again.

The idea for detecting space leaks is quite simple:

* find some data that we expect to be GC'd later, make a weak pointer to it
* when we expect the data to be dead, do a `performGC` and then check
  the status of the weak pointer.

It would be nice to apply this trick to lots of things in GHC,
e.g. ensuring that HsSyn is not retained after the desugarer, or
ensuring that CoreSyn from the previous simplifier pass is not retained.

Test Plan: validate

Reviewers: bgamari, simonpj, erikd, niteria

Subscribers: thomie, carter

GHC Trac Issues: #15111
Note: See TracTickets for help on using tickets.