当导出要从C调用的Haskell函数时,何时收集Haskell的垃圾?如果C拥有main
,则无法预测下一次调用Haskell。在运行单线程Haskell或没有并行GC时,这个问题尤为重要。
答案 0 :(得分:3)
初始化ghc
运行时时,可以通过argc和argv like so将rts标志传递给它:
RtsConfig conf = defaultRtsConfig;
conf.rts_opts_enabled = RtsOptsAll;
hs_init_ghc(&argc, &argv, conf);
这使您set options可以修复较小的最大堆大小,或者在托儿所上使用压缩算法来进一步减少分配。此外,请注意,有一个空闲GC,其间隔可以设置(或禁用),如果链接线程运行时,无论您是否回退到Haskell调用,都应该运行。
编辑:我实际上没有进行过实验来验证以下内容,但如果我们查看source of hs_init_ghc,我们会看到它初始化信号处理程序,其中应包含{ {3}}响应SIGVTALRM
,实际上它也会启动时间,调用(在POSIX上)timer handlers应该定期抛出这些信号。反过来,这定期应该唤醒&#34; RTS是否发生了任何事情,这反过来意味着它将运行空闲GC,无论系统是否从C回收到Haskell。但是,我再次阅读代码和评论,而不是自己测试。< / p>