了解GHC的+ RTS -t -RTS选项的输出

时间:2014-09-11 13:47:08

标签: haskell ghc

我正在对使用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手册,输出显示:

  • 程序在整个运行过程中分配的总字节数。
  • 执行的垃圾收集总数。
  • 平均和最大“驻留时间”,即以字节为单位的实时数据量。运行时只能确定主要GC期间的实时数据量,这就是为什么样本数量与主要GC的数量相对应(并且通常相对较小)。
  • RTS从操作系统分配的峰值内存。
  • 初始化运行时系统(INIT),运行程序本身(MUT,mutator)和垃圾收集(GC)时的CPU时间和挂钟时间。

应用于我的示例,这意味着我的程序将82321 MiB(字节除以1024 ^ 2)混乱,执行160722个垃圾收集,具有51MiB / 72MiB平均/最大内存驻留,在RAM中分配最多191M内存等......

现在我想知道,什么?平均和最大“驻留”,即以字节为单位的实时数据量«与RTS从操作系统分配的峰值内存«?还有:什么使用大约120M的剩余空间?

我被指出here以获取更多信息,但这并没有明确说明,我想知道什么。另一个source(5.4.4秒项)暗示120M内存用于垃圾收集。但这太模糊了 - 我需要一个可引用的信息来源。

那么请问,有没有人可以用好的来源作为证据回答我的问题?

亲切的问候!

1 个答案:

答案 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技术了解多少,但您可以尝试阅读这些: