手动调用 `gc()` 会导致所有 `finalizers` 立即执行吗?
Does calling `gc()` manually, result in all `finalizers` being executed immediately?
我怀疑某些代码正在泄漏内存。
由于代码使用 ccall
并维护指针内保存的重要信息,
应该由在 finalizer
期间 ccall
ed 的代码释放。
在我的调试中,我正在调用 gc()
。
我想知道这是否会立即触发所有附加到已移出范围的对象的 finalizer
s
答案应仅与 julie 0.5+ 有关。
在对@Isaiah 的回答(已删除)进行讨论后,我决定与一些内部人员打交道,弄清楚这一点。因此,我有充分的理由认为,当 gc()
在顶层 被调用时 – 即不在本地范围内 – 然后可以依赖以下保证:
if an object is unreachable and you call gc()
it’ll be finalized
这是非常明确的。顶级部分很重要,因为当您在本地范围内调用 gc()
时,本地引用可能会或可能不会被视为可访问,即使它们永远不会被再次使用。
这种保证确实消除了 "reachability" 地毯下的一些不确定性,因为一个对象是否可达可能并不明显,因为语言运行时可能出于各种原因保留对某些对象的引用。这些原因 应该 被详尽地记录下来,但目前还没有。运行时保留对象的几个值得注意的情况是:
单例类型的唯一实例是永久的,永远不会被收集或终结;
方法缓存也是永久性的,这尤其意味着模块不会被释放,而您可能希望它们被释放,因为方法缓存保留对定义它们的模块的引用。
然而,在 "normal circumstances" 下——我怀疑这个问题是什么意思——是的,当对象不再可访问时调用 gc()
将 使其被收集并最终确定 "immediately",即在 gc()
调用 returns.
之前
我怀疑某些代码正在泄漏内存。
由于代码使用 ccall
并维护指针内保存的重要信息,
应该由在 finalizer
期间 ccall
ed 的代码释放。
在我的调试中,我正在调用 gc()
。
我想知道这是否会立即触发所有附加到已移出范围的对象的 finalizer
s
答案应仅与 julie 0.5+ 有关。
在对@Isaiah 的回答(已删除)进行讨论后,我决定与一些内部人员打交道,弄清楚这一点。因此,我有充分的理由认为,当 gc()
在顶层 被调用时 – 即不在本地范围内 – 然后可以依赖以下保证:
if an object is unreachable and you call
gc()
it’ll be finalized
这是非常明确的。顶级部分很重要,因为当您在本地范围内调用 gc()
时,本地引用可能会或可能不会被视为可访问,即使它们永远不会被再次使用。
这种保证确实消除了 "reachability" 地毯下的一些不确定性,因为一个对象是否可达可能并不明显,因为语言运行时可能出于各种原因保留对某些对象的引用。这些原因 应该 被详尽地记录下来,但目前还没有。运行时保留对象的几个值得注意的情况是:
单例类型的唯一实例是永久的,永远不会被收集或终结;
方法缓存也是永久性的,这尤其意味着模块不会被释放,而您可能希望它们被释放,因为方法缓存保留对定义它们的模块的引用。
然而,在 "normal circumstances" 下——我怀疑这个问题是什么意思——是的,当对象不再可访问时调用 gc()
将 使其被收集并最终确定 "immediately",即在 gc()
调用 returns.