我正在对使用 GHC 编译的 haskell 程序的内存消耗进行基准测试。为此,我使用以下命令行参数运行该程序:+RTS -t -RTS。下面是一个示例输出:\n <<ghc: 86319295256 bytes, 160722 GCs, 53963869/75978648 avg/max bytes residency (386 samples), 191M in use, 0.00 INIT (0.00 elapsed), 152.69 MUT (152.62 elapsed), 58.85 GC (58.82 elapsed) :ghc>>。\n根据 ghc 手册,输出显示:
应用于我的示例,这意味着我的程序会混洗 82321 MiB(字节除以 1024^2),执行 160722 次垃圾收集,具有 51MiB/72MiB 平均/最大内存驻留,在 RAM 中分配最多 191M 内存等等。 ..
\n\n现在我想知道,\xc2\xbb 的平均和最大“驻留”(即以字节为单位的实时数据量)\xc2\xab 与 \xc2\xbbRTS 从 OS\xc2\ 分配的峰值内存相比哈布?还有:大约120M的剩余空间用来做什么?
\n\n有人向我指出了更多信息,但这并没有明确说明我想知道什么。另一个来源(5.4.4第二项)暗示120M内存用于垃圾收集。但这太模糊了 \xe2\x80\x93 我需要一个可引用的信息源。
\n\n那么请问,有没有人可以用好的资料作为证据来回答我的问题?
\n\n亲切的问候!
\n“常驻”大小是您拥有多少实时 Haskell 数据。从操作系统实际分配的内存量可能会更高。
RTS 以“块”的形式分配内存。如果您的程序需要 7.3 块 RAM,则 RTS 必须分配 8 块,其中 0.7 块是空闲空间。
默认垃圾收集算法是 2 空间收集器。也就是说,当空间 A 填满时,它会分配空间 B(完全是空的),并将所有实时数据从空间 A 复制到空间 B 中,然后释放空间 A。这意味着,在一段时间内,您处于使用实际需要的 2 倍内存。(我相信某处有一个开关可以使用 1 空间算法,该算法速度较慢,但使用的 RAM 较少。)
管理线程也有一些开销(特别是如果你有很多线程),并且可能还有其他一些事情。
我不知道您对 GC 技术了解多少,但您可以尝试阅读以下内容:
http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel-gc/par-gc-ismm08.pdf
http://www.mm-net.org.uk/workshop190404/GHC%27s_Garbage_Collector.ppt