我有一些我怀疑是泄漏记忆的代码。
由于代码使用ccall
并维护指针内的重要信息,
这些应该是ccall
期间finalizer
编码的免费代码。
在我的调试中,我正在呼叫gc()
。
我想知道这是否会立即触发附加到已超出范围的对象的所有finalizer
答案应该只关注朱莉0.5 +。
答案 0 :(得分:5)
在讨论了@ Isaiah的答案(删除)之后,我决定戳一些内部人员,并对此有所了解。因此,我有充分的权威,当gc()
被称为在顶层 - 即不在本地范围内 - 那么可以依赖以下保证:
如果某个对象无法访问,并且您致电
gc()
,则会最终确定
非常明确。顶级部分非常重要,因为当您在本地范围内调用gc()
时,本地引用可能被认为是可以访问的,也可能不被认为是可访问的,即使它们永远不会被再次使用。
这种保证确实在“可达性”的范围内扫除了一些不确定性,因为对象是否可到达可能并不明显,因为语言运行时可能由于各种原因而保留对某些对象的引用。这些原因应该详尽记录,但目前它们不是。运行时保存到对象的几个值得注意的情况是:
单例类型的唯一实例是永久性的,永远不会被收集或最终确定;
方法高速缓存也是永久性的,特别是,意味着当您可能期望它们时,模块不会被释放,因为方法高速缓存会保留对定义它们的模块的引用。
然而,在“正常情况下” - 这是我怀疑这个问题正在进行 - 是的,当一个对象不再可用时调用gc()
将导致它被收集并且最终“立即”完成,即在gc()
调用返回之前。