当调用 Haskell 时,垃圾收集器 运行 何时从 C 导出?

When does the garbage collector run when calling Haskell exports from C?

导出要从 C 调用的 Haskell 函数时,何时收集 Haskell 的垃圾?如果 C 拥有 main,则无法预测下一次调用 Haskell。当 运行 单线程 Haskell 或没有并行 GC 时,这个问题尤其重要。

当您初始化 ghc 运行时间时,您可以通过 argc 和 argv 将 rts 标志传递给它 like so:

  RtsConfig conf = defaultRtsConfig;
  conf.rts_opts_enabled = RtsOptsAll;
  hs_init_ghc(&argc, &argv, conf);

这可以让您 set options 修复一个较小的最大堆大小或在 nursery 上使用压缩算法以进一步减少分配。此外,请注意有一个空闲 GC,其间隔可以设置(或禁用),如果你 link 线程 运行 时间,那应该 运行 无论你是否曾经退让Haskell 个电话。

编辑:我实际上没有进行实验来验证以下内容,但如果我们查看 source of hs_init_ghc we see that it initializes signal handlers, which should include the timer handlers that respond on SIGVTALRM and indeed it also starts the time, which calls (on POSIX) timer_create 应该会定期发出这些信号。反过来,这应该定期 "wake up" RTS 无论是否发生任何事情,这反过来应该意味着它将 运行 空闲 GC 无论系统是否从 C 返回到 Haskell . 不过还是那句话,我只看过代码和注释,没有亲自测试过。