首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >外部数据和垃圾收集

外部数据和垃圾收集
EN

Stack Overflow用户
提问于 2017-12-30 05:11:37
回答 2查看 263关注 0票数 1

当我通过FFI分配一些数据并将终结器与其关联时,我在Haskell中得到了一个ForeignPtr。当该指针变为未引用时,GC将收集该指针,这会导致终结器运行。但收集仅在GC运行时发生,并且“取消引用”不会强制GC运行。也就是说,可以有许多指针,但由于指针本身不占用太多内存,RTS根本看不到启动GC的理由,因为根据我的investigations,RTS不会跟踪外部数据的大小。这是正确的吗?

我如何向RTS传达“当此指针变为未引用时,立即收集它”?是否有允许控制何时启动GC的标志?这对于真正的程序来说是个问题吗(因为任何真正的程序总是有足够的显式垃圾来刺激GC)?

EN

Stack Overflow用户

回答已采纳

发布于 2017-12-30 05:37:36

在运行GC之前,RTS不知道是否有任何数据未被引用。GHC没有引用计数GC,这将允许对垃圾立即采取行动。您可以尝试自己实现引用计数,或者使用System.Mem中的手动GC。

在Haskell-land中不跟踪国外分配。如果您想要更多控制,但没有自定义GC或引用计数,则可以使用Foreign.Marhsal.Array进行手动/作用域分配和释放。

另一种选择是在GHC RTS中使用固定分配。这为您提供了不被GC移动的内存。对固定数据的引用可以在没有开销的情况下传递给外部代码,但是固定数据是被跟踪的,可以是GC-d,并且触发GC的方式与通常的堆数据相同。用于固定数据的Here's one API。另一种选择是简单的ByteString。固定数据的可能缺点是内存碎片和较慢的分配,但这也适用于(任何)返回稳定指针的外部分配。

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48028503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档