Memory leak
From HaskellWiki
(explanation) |
(detection of a memory leak) |
||
| Line 19: | Line 19: | ||
in sum (makeXs False) * product (makeXs True) | in sum (makeXs False) * product (makeXs True) | ||
</haskell> | </haskell> | ||
| + | |||
| + | 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: | ||
| + | <code> | ||
| + | $ ./mytest +RTS -M4m -RTS | ||
| + | </code> | ||
| + | |||
[[Category:Glossary]] | [[Category:Glossary]] | ||
Revision as of 23:51, 18 June 2010
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
