Personal tools

Memory leak

From HaskellWiki

Revision as of 23:51, 18 June 2010 by Lemming (Talk | contribs)

Jump to: navigation, search

A memory leak means that a program allocates more memory than necessary for its execution. Although Haskell implementations use garbage collectors, programmers must still keep memory management in mind. A garbage collector can reliably prevent dangling pointers, but it is easily possible to produce memory leaks, especially in connection with lazy evaluation.

Consider for example:

let xs = [1..1000000::Integer]
in  sum xs * product xs
Since most Haskell compilers expect, that the programmer used
let
in order to share
xs
between the call of
sum
and the call of
product
, the list
xs
is completely materialized and hold in memory. However, the list
xs
is very cheap to compute, and thus it would reduce memory usage considerably, if
xs
is recomputed for both calls.

Since we want to avoid code duplication, we like to achieve this by turning the list definition into a function with a dummy argument.

let makeXs _ = [1..1000000::Integer]
in  sum (makeXs False) * product (makeXs True)

A memory leak will not only consume more and more memory but it will also slow down the garbage collector considerably!

Detection of memory leaks

A memory leak can be detected by writing a test that should require only a limitted amount of memory and then run the compiled program with restricted heap size. E.g. you can restrict the heap size to 4 MB like in this example: $ ./mytest +RTS -M4m -RTS