讨论一下.NET的垃圾回收

wkevin27 2003-05-14 11:06:10
《C# Primer Plus》中有这么一段:

当GC在某时刻发现某个对象被废弃了而且没有析构函数,GC就会立即回收它(1)。相反,当发现废弃对象带有一个析构函数声明,GC就将它的引用与其他需要同样处理对象放入一个特殊的列表中,等待执行他们的析构函数语句。
当GC结束突发性废弃对象判断后,它就启动另一个进程,执行上述特殊列表中每一个对象的析构函数中的语句。(2)
最后,讲每个对象的引用(3)放在另一个即将回收对象列表中。不过,直到GC的下一次突发性动作,他们才会被回收。

(1)我觉得可能具体是指此次突发性废弃对象判断后紧接着的回收进程中得到回 收。
(2) 析构函数里可能包含有用户自己编写的资源回收语句(C++程序员尤其喜欢如此),那么还需要第二个突发性动作来做什么呢?
(3)这里的“对象的引用”指什么?是指还残留在内存中的对象实例吗?
(4)始终不明白析构函数和Finalize()是什么关系?GC是如何区别对待他们两个的?
...全文
66 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
superct 2003-05-16
  • 打赏
  • 举报
回复
对象只当在没有任何引用的情况下才会被回收,对象的内存在生存期结束后不是马上释放的,GC会在任何时候将其回收,如果没有特殊需要,不建议强制回收。
.NET下已经不存在Destructor的概念,它变成了Finalizer

如果没有特殊的需要不要写Finalizer。
不要在Finalizer中写一些有时间逻辑的代码。
在任何有非托管资源或含有Dispose的成员的类中实现IDisposable接口。
按照给出的Dispose设计写自己的Dispose代码。
当用胖对象时可以考虑弱引用的使用。

请参见:GC,通往自由的大道
http://www.microsoft.com/china/community/TechZone/TechArticle/TechDoc/gcview.asp
lx1920 2003-05-15
  • 打赏
  • 举报
回复
析构函数和Finalize()没有区别

只不过是c#中的特殊语法
yaoyuhang 2003-05-15
  • 打赏
  • 举报
回复
up
codinghello 2003-05-15
  • 打赏
  • 举报
回复
adfadfasdfasdfsadf
wkevin27 2003-05-14
  • 打赏
  • 举报
回复
这个偶明白,用户要把GC当透明对待。
但我不知道GC在做废弃对象判断和垃圾回收两步骤的时候,是紧挨着执行,还是中间有空挡。
还有,第四个问题最费解!
yqdeng 2003-05-14
  • 打赏
  • 举报
回复
托管资源都是由GC回收,自己没法回收

1,979

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧