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 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