Opened 7 years ago

Closed 7 years ago

#4208 closed bug (fixed)

ghci/Linker.lhs space leaks

Reported by: TristanAllwood Owned by: igloo
Priority: normal Milestone: 7.0.1
Component: GHC API Version: 6.12.3
Keywords: Cc:
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:


Lots of repeated calls to getHValue in ghci/Linker.lhs will cause a thunk to grow (THUNK_2_0 according to -hT). Calling showLinkerState after each getHValue (in an attempt to force it) shows PersistentLinkerState grows in size quite rapidly.

Possibly related: #4029

Attachments (1) (15.2 KB) - added by TristanAllwood 7 years ago.
Heap profile

Download all attachments as: .zip

Change History (5)

comment:1 Changed 7 years ago by TristanAllwood

(I plan to knock up a minimal example to demonstrate this v.soon)

comment:2 Changed 7 years ago by TristanAllwood

Small example to replicate, (uses ghc-paths from hackage)

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE MagicHash #-}
module Main where

import GHC.Paths
import GHC
import Control.Monad
import PrelNames
import Linker
import GHC.Prim
import MonadUtils

main :: IO ()
main = runGhc (Just libdir) $ do
  dflags' <- getSessionDynFlags 
  primPackages <- setSessionDynFlags dflags'
  dflags <- getSessionDynFlags
  defaultCleanupHandler dflags $ do
    liftIO $ initDynLinker dflags
    liftIO $ linkPackages dflags primPackages
    replicateM_ 1000000 $ do
      !printVal <- getSession >>= (liftIO . flip getHValue printName)
      return ()

run with

ghc --make -package ghc X.hs
./X +RTS -hT -RTS

hp2ps graph output attached

Changed 7 years ago by TristanAllwood

Attachment: added

Heap profile

comment:3 Changed 7 years ago by igloo

Owner: set to igloo

comment:4 Changed 7 years ago by igloo

Milestone: 6.14.1
Resolution: fixed
Status: newclosed

Thanks for the report; fixed:

Tue Jul 27 21:19:11 BST 2010  Ian Lynagh <>        
  * Make PersistentLinkerState fields strict; fixes #4208
  We modify fields a lot, so we retain the old value if they aren't forced.
Note: See TracTickets for help on using tickets.