7

我有一些我怀疑正在泄漏内存的代码。由于代码使用ccall并维护了保存在指针中的重要信息,这些信息应该由ccall在 s 期间编辑的代码释放finalizer

在我的调试中,我正在调用gc(). 而且我想知道这是否会立即触发所有finalizer附加到已移出范围的对象的 s

答案应该只关注 julie 0.5+。

4

1 回答 1

8

在讨论了@Isaiah 的答案(已删除)之后,我决定戳一些内部人员并对此进行澄清。因此,我有充分的权威,当在顶层gc()调用时- 即不在本地范围内 - 然后可以依赖以下保证:

如果一个对象无法访问并且您调用gc()它,它将被最终确定

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

这种保证确实在“可达性”的地毯下扫除了一些不确定性,因为对象是否可达可能并不明显,因为语言运行时可能会出于各种原因保留对某些对象的引用。这些原因应该详尽地记录下来,但目前还没有。运行时保留对象的几个值得注意的情况是:

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

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

然而,在“正常情况”下——这就是我怀疑这个问题的意思——是的,gc()当一个对象不再可访问时调用导致它被“立即”收集并最终确定,即在gc()调用返回之前。

于 2017-06-12T15:19:35.463 回答