手动调用 `gc()` 会导致所有 `finalizers` 立即执行吗?

Does calling `gc()` manually, result in all `finalizers` being executed immediately?

我怀疑某些代码正在泄漏内存。 由于代码使用 ccall 并维护指针内保存的重要信息, 应该由在 finalizer 期间 ccalled 的代码释放。

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

答案应仅与 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.

之前