c#的垃圾对象何时被回收?

schinar 2011-12-18 10:56:13
在看书中,有这么一段话:"当处理newobj(cil 的new指令)指令时,如果CLR判定托管堆没有足够的空间来分配所请求的类型,它会执行一次垃圾回收来尝试释放内存".也就是说如果托管堆没有足够的内存来分配所请求的对象,就会进行垃圾回收.
那么这段话是不是可以这样理解:
1,对象已经没用了,但是接下来没有分配内存的操作,所以一直也不会进行垃圾回收.
2,对象已经没有用了,虽然接下来还有分配内存的操作,但是内存空间足够,所以也一直不会进行垃圾回收.
这样垃圾对象就会一直在托管堆存在.
是这样理解吗?
...全文
276 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
schinar 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zh6335901 的回复:]
对象总共分为0、1、2三代,新建的对象为0代,经过1次垃圾回收而存活下来的对象为1代,经过一次以上存活下来的对象为2代,而垃圾回收开始回收时总是在存储第0代的空间满时发生(非强制),然后回收第0代,然后检查第1代,如果满就回收第一代。。就这样下去,所以就有可能出现对象没有引用也不会被回收,因为该对象所在的代的空间还没满
[/Quote]

看来这种情况也有可能,说明CLR的垃圾回收机制很是复杂.总之当托管堆待分配的空间不足了或是应用程序域被卸载都将引发垃圾回收.
zh6335901 2011-12-18
  • 打赏
  • 举报
回复
对象总共分为0、1、2三代,新建的对象为0代,经过1次垃圾回收而存活下来的对象为1代,经过一次以上存活下来的对象为2代,而垃圾回收开始回收时总是在存储第0代的空间满时发生(非强制),然后回收第0代,然后检查第1代,如果满就回收第一代。。就这样下去,所以就有可能出现对象没有引用也不会被回收,因为该对象所在的代的空间还没满
mizuho_2006 2011-12-18
  • 打赏
  • 举报
回复
没有引用的对象,隔一段时间系统会自动释放资源,类似JAVA中的垃圾回收功能
而不用像C++中需要手工写析构函数去释放

也可以用using自动dispose以释放资源
  • 打赏
  • 举报
回复
不是说“只有”堆空间不足时才运行GC。实际的设计肯定会经改变,这其实是.net开发人员可以进行一种“调试”的程序参数,它可以有很多策略来启动一次GC回收操作,例如可以在系统进入 Idel 状态中断时等等。
  • 打赏
  • 举报
回复
几秒钟以后。

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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