求教一个GC的问题

lulianqi 2017-02-08 04:58:11


上图已经用Release的方式 生成了,为什么点左边启动按钮,出来最后还是没有回收成功,是不是在IDE里面 都是用Debug模式执行的,还是有其他的细节?
求教
...全文
245 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
暂时就不用以这个例子来纠结 gc 能不能判断变量可以2代释放的问题了。一般来说,不论 gc 能不能,你都应该写到 using(){...} 结构中,当离开这个结构时,.net 会花时间等待底层操作系统报告说关闭了文件,再继续执行。 既然你在 Release.exe 单独发布版本时测试它是正确的,那就算了。只要是对“大的”结果价值不高,不过细抠它。除非你写出一个测试证明要抠的技术很有价值,再重新来考虑技术。
  • 打赏
  • 举报
回复
引用 7 楼 lulianqi 的回复:
我尝试了在强制回收后休眠线程一段时间再去向下执行,依然没有效果,似乎并没有执行fs的析构函数,或者GC还是认为fs可达 另外还有一个细节,上面的代码Release编译出来的exe,直接双击执行,是可以直接通过测试的。
你的代码在我的比较快的笔记本上,在 vs2015 下一 Release 方式,直接 F5,也是可以通过的。
  • 打赏
  • 举报
回复
你没关闭流,所以文件还是打开的,再说你的写法有问题,fs.Close();关闭流就行了,并不需要强行GC,切记非万不得已不要手动GC
lulianqi 2017-02-08
  • 打赏
  • 举报
回复
引用 8 楼 wddw1986 的回复:
[quote=引用 7 楼 lulianqi 的回复:] [quote=引用 5 楼 sp1234 的回复:] 磁盘操作系统处理这些操作本身有缓存和延迟。你要是换一个比较快的 SSD 硬盘试试,就会发现执行通过了。
我尝试了在强制回收后休眠线程一段时间再去向下执行,依然没有效果,似乎并没有执行fs的析构函数,或者GC还是认为fs可达 另外还有一个细节,上面的代码Release编译出来的exe,直接双击执行,是可以直接通过测试的。[/quote] 谁告诉你GC要执行执行fs的析构函数?凭什么你说fs不可达?[/quote] 有析构函数的对象,系统检测到后会把他们的指针加入终结列表,当被扫描到不可达后移入freachable列表,最后回收时会执行列表里的析构函数,析构函数里会有dispose方法,如果没有手动释放,这个时候就会释放 因为后面的代码里已经没有用到fs了,fs这个时候就已经是垃圾了(debug的时候会让fs活到方法结束)CG搜索的时候就会标记为不可达
cheng2005 2017-02-08
  • 打赏
  • 举报
回复
引用 7 楼 lulianqi 的回复:
[quote=引用 5 楼 sp1234 的回复:] 磁盘操作系统处理这些操作本身有缓存和延迟。你要是换一个比较快的 SSD 硬盘试试,就会发现执行通过了。
我尝试了在强制回收后休眠线程一段时间再去向下执行,依然没有效果,似乎并没有执行fs的析构函数,或者GC还是认为fs可达 另外还有一个细节,上面的代码Release编译出来的exe,直接双击执行,是可以直接通过测试的。[/quote] 谁告诉你GC要执行执行fs的析构函数?凭什么你说fs不可达?
lulianqi 2017-02-08
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
磁盘操作系统处理这些操作本身有缓存和延迟。你要是换一个比较快的 SSD 硬盘试试,就会发现执行通过了。
我尝试了在强制回收后休眠线程一段时间再去向下执行,依然没有效果,似乎并没有执行fs的析构函数,或者GC还是认为fs可达 另外还有一个细节,上面的代码Release编译出来的exe,直接双击执行,是可以直接通过测试的。
lulianqi 2017-02-08
  • 打赏
  • 举报
回复
引用 4 楼 Forty2 的回复:
两个问题: 1、用垃圾回收来关闭本地资源的编程逻辑不是好的做法。正确的方法是要用Dispose模式。 2、如果你在做实验,那么你对GC.Collect的理解有误。它是启动一个垃圾回收,并不是完成一个垃圾回收,因此你要加:
GC.Collect(2, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();  // 等待FileStream等的Finalier完成。
我尝试了加入GC.WaitForPendingFinalizers 方法,依然没有相关,似乎并没有执行fs的析构函数,或者GC还是认为fs可达 另外还有一个细节,上面的代码Release编译出来的exe,直接双击执行,是可以直接通过测试的。
  • 打赏
  • 举报
回复
磁盘操作系统处理这些操作本身有缓存和延迟。你要是换一个比较快的 SSD 硬盘试试,就会发现执行通过了。
Forty2 2017-02-08
  • 打赏
  • 举报
回复
两个问题: 1、用垃圾回收来关闭本地资源的编程逻辑不是好的做法。正确的方法是要用Dispose模式。 2、如果你在做实验,那么你对GC.Collect的理解有误。它是启动一个垃圾回收,并不是完成一个垃圾回收,因此你要加:
GC.Collect(2, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();  // 等待FileStream等的Finalier完成。
忆寒哥哥耶 2017-02-08
  • 打赏
  • 举报
回复
确实和GC没关系
  • 打赏
  • 举报
回复
你的文件没有关闭,你应该在fs.Write()后面加上fs.Close()。对于文件,流和句柄等资源,需要手动释放,否则不会回收。
xdashewan 2017-02-08
  • 打赏
  • 举报
回复
你这个是文件系统占用问题,和gc没有关系,两个应用抢文件了

111,096

社区成员

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

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

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