GHCI 怎么可能显示比我实际拥有的价值更大的已用内存?
How is it possible GHCI displays used memory of bigger value than I physically have?
基本问题来自 GHCI 解释器的引用。是的,我知道代码的假定用途是将其编译成可执行文件,但是,由于我是 Haskell 的初学者,GHCI 似乎非常适合学习一些 Haskell.
当我使用高计算负载算法时,有时会遇到如下消息:
Prelude Data.List> foldl' (+) 0 [1..2*10^8]
20000000100000000
it :: (Num b, Enum b) => b
(8.35 secs, 17,600,063,056 bytes)
同时,我只有 8 GB 的物理内存。
如果内存使用量超过一定限度(我不太确定是多少,但建议这是可以使用的所有内存),则会抛出 Stack Overflow 异常,如下图所示:
Prelude> foldl (+) 0 [1..5 * 10^7]
*** Exception: stack overflow
但是,当我的 RAM 总计为 8 GB 时程序使用了 > 16 GB 的内存并且没有抛出 Stack Overflow 异常怎么可能?
垃圾收集的魔力:您显示的 :set +s
报告的数字告诉分配器请求的字节总数,即使它们后来被释放并返回给分配器以在计算完成。
基本问题来自 GHCI 解释器的引用。是的,我知道代码的假定用途是将其编译成可执行文件,但是,由于我是 Haskell 的初学者,GHCI 似乎非常适合学习一些 Haskell.
当我使用高计算负载算法时,有时会遇到如下消息:
Prelude Data.List> foldl' (+) 0 [1..2*10^8]
20000000100000000
it :: (Num b, Enum b) => b
(8.35 secs, 17,600,063,056 bytes)
同时,我只有 8 GB 的物理内存。
如果内存使用量超过一定限度(我不太确定是多少,但建议这是可以使用的所有内存),则会抛出 Stack Overflow 异常,如下图所示:
Prelude> foldl (+) 0 [1..5 * 10^7]
*** Exception: stack overflow
但是,当我的 RAM 总计为 8 GB 时程序使用了 > 16 GB 的内存并且没有抛出 Stack Overflow 异常怎么可能?
垃圾收集的魔力:您显示的 :set +s
报告的数字告诉分配器请求的字节总数,即使它们后来被释放并返回给分配器以在计算完成。