手动调用`gc()`会导致所有`终结器'立即执行吗?

时间:2017-06-10 02:57:06

标签: garbage-collection julia finalization

我有一些我怀疑是泄漏记忆的代码。 由于代码使用ccall并维护指针内的重要信息, 这些应该是ccall期间finalizer编码的免费代码。

在我的调试中,我正在呼叫gc()。 我想知道这是否会立即触发附加到已超出范围的对象的所有finalizer

答案应该只关注朱莉0.5 +。

1 个答案:

答案 0 :(得分:5)

在讨论了@ Isaiah的答案(删除)之后,我决定戳一些内部人员,并对此有所了解。因此,我有充分的权威,当gc()被称为在顶层 - 即不在本地范围内 - 那么可以依赖以下保证:

  

如果某个对象无法访问,并且您致电gc(),则会最终确定

非常明确。顶级部分非常重要,因为当您在本地范围内调用gc()时,本地引用可能被认为是可以访问的,也可能不被认为是可访问的,即使它们永远不会被再次使用。

这种保证确实在“可达性”的范围内扫除了一些不确定性,因为对象是否可到达可能并不明显,因为语言运行时可能由于各种原因而保留对某些对象的引用。这些原因应该详尽记录,但目前它们不是。运行时保存到对象的几个值得注意的情况是:

  • 单例类型的唯一实例是永久性的,永远不会被收集或最终确定;

  • 方法高速缓存也是永久性的,特别是,意味着当您可能期望它们时,模块不会被释放,因为方法高速缓存会保留对定义它们的模块的引用。

然而,在“正常情况下” - 这是我怀疑这个问题正在进行 - 是的,当一个对象不再可用时调用gc() 导致它被收集并且最终“立即”完成,即在gc()调用返回之前。