我正在对使用GHC编译的haskell程序的内存消耗进行基准测试。为此,我使用以下命令行参数运行程序:+RTS -t -RTS
。这是一个示例输出:
<<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>>
。
根据ghc手册,输出显示:
应用于我的示例,这意味着我的程序将82321 MiB(字节除以1024 ^ 2)混乱,执行160722个垃圾收集,具有51MiB / 72MiB平均/最大内存驻留,在RAM中分配最多191M内存等......
现在我想知道,什么?平均和最大“驻留”,即以字节为单位的实时数据量«与RTS从操作系统分配的峰值内存«?还有:什么使用大约120M的剩余空间?
我被指出here以获取更多信息,但这并没有明确说明,我想知道什么。另一个source(5.4.4秒项)暗示120M内存用于垃圾收集。但这太模糊了 - 我需要一个可引用的信息来源。
那么请问,有没有人可以用好的来源作为证据回答我的问题?
亲切的问候!
答案 0 :(得分:2)
&#34;居民&#34;大小是你有多少活Haskell数据。从操作系统实际分配的内存量可能更高。
RTS在&#34; blocks&#34;中分配内存。如果你的程序需要7.3块RAM,那么RTS必须分配8块,其中0.7块是空的。
默认的垃圾收集算法是一个2空间的收集器。也就是说,当空间A填满时,它会分配空间B(这是完全空的)并将所有实时数据从空间A复制到空间B,然后释放空间A.这意味着,有一段时间,你&#39 ;重新使用2倍于实际需要的RAM。 (我相信在某处可以使用1空格算法,这种算法速度较慢但使用较少的RAM。)
管理线程也有一些开销(特别是如果你有很多),还可能有其他一些事情。
我不知道您对GC技术了解多少,但您可以尝试阅读这些: