首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >垃圾收集

问垃圾收集
EN

Stack Overflow用户
提问于 2011-03-28 22:10:35
回答 4查看 264关注 0票数 0

如果对象包含finalize方法,但该对象仍被引用,则garbabe收集器是从堆中移除该对象还是仅清除非托管资源

EN

回答 4

Stack Overflow用户

发布于 2011-03-28 22:12:30

.NET中的GC不会自动清理非托管资源。这就是IDisposable的作用。直到不再需要所有引用时,才会调用finalize。

票数 4
EN

Stack Overflow用户

发布于 2011-03-28 22:13:08

如果对象仍然被引用,GC就没有理由收集它或运行终结器。

此外,GC不清理任何非托管资源。它只是回收你的对象所使用的内存。你必须自己在终结器和IDisposable.Dispose()中清理所有的非托管资源。

票数 0
EN

Stack Overflow用户

发布于 2011-03-28 22:14:06

http://www.csharphelp.com/2006/08/garbage-collection/

关于垃圾收集和finalize的很好的文章。如果你问我,这里的答案太深入了。

每当在堆上分配具有Finalize方法的新对象时,都会将指向该对象的指针放入名为Finalize queue的内部数据结构中。当对象不可达时,垃圾回收器将该对象视为垃圾。垃圾收集器扫描终结队列,查找指向这些对象的指针。当找到一个指针时,该指针将从终结队列中移除,并附加到另一个称为可自由访问队列的内部数据结构中,从而使该对象不再是垃圾的一部分。此时,垃圾收集器已经完成了垃圾的识别。垃圾收集器压缩可回收内存,特殊的运行时线程清空可达队列,执行每个对象的Finalize方法。

下次调用垃圾收集器时,它会看到最终确定的对象是真正的垃圾,然后这些对象的内存就会被释放。

因此,当一个对象需要终结化时,它会死亡,然后存活(复活),最后死亡。建议避免使用Finalize方法,除非required.Finalize方法在两次垃圾回收之前不让该对象使用的内存和资源被释放,从而增加内存压力。由于您无法控制finalize方法的执行顺序,因此可能会导致不可预测的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5460221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档