作者:厮守这一季德冬天_262 | 来源:互联网 | 2023-02-01 16:37
我有一些我怀疑是泄漏记忆的代码.因为代码使用ccall
并维护指针内部保存的重要信息,这些信息应该由s ccall
期间编写的代码释放finalizer
.
在我的调试中,我正在打电话gc()
.我想知道这是否会立即触发finalizer
附加到已超出范围的对象的所有s
答案应该只关注julie 0.5+.
1> StefanKarpin..:
在讨论了@ Isaiah的回答(删除)之后,我决定戳一些内部人员,并对此有所了解.因此,我有良好的权限,当在顶级gc()
调用时 - 即不在本地范围内 - 然后可以依赖以下保证:
如果某个对象无法访问,您调用gc()
它将被最终确定
这很清楚.顶级部分非常重要,因为当您gc()
在本地范围内调用时,本地引用可能被认为是可以访问的,也可能不被认为是可访问的,即使它们永远不会被再次使用.
这种保证确实在"可达性"的范围内扫除了一些不确定性,因为对象是否可到达可能并不明显,因为语言运行时可能由于各种原因而保留对某些对象的引用.这些原因应该详尽记录,但目前并非如此.运行时保存到对象的几个值得注意的情况是:
单例类型的唯一实例是永久性的,永远不会被收集或最终确定;
方法高速缓存也是永久性的,特别是,意味着当您可能期望它们时,模块不会被释放,因为方法高速缓存会保留对定义它们的模块的引用.
然而,在"正常情况下" - 我怀疑这个问题正在进行 - 是的,gc()
当一个对象不再可达时调用将导致它被"立即"收集并最终确定,即在gc()
呼叫返回之前.