StreamWriter资源无法释放

goto_code 2013-07-05 02:10:42

private void button1_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("f://test.txt", true, Encoding.Default);
sw.WriteLine("ABCD");
sw.Flush();
sw.Close();
sw.Dispose();
}


每次执行都增加8k-10几k的内存资源,貌似那些所谓释放的命令都没什么效果,求大神们指点
...全文
380 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
人生导师 2013-07-06
  • 打赏
  • 举报
回复
建议你看看Clr via C# 中垃圾回收章节,你调用Dispose方法只是释放本地资源,即文件句柄,然而内存中的并没有被清楚,你可以每次显示把sw设置为null的方式看看内存的使用情况的
  • 打赏
  • 举报
回复
引用 楼主 goto_code 的回复:

private void button1_Click(object sender, EventArgs e)
        {
            StreamWriter sw = new StreamWriter("f://test.txt", true, Encoding.Default);
            sw.WriteLine("ABCD");
            sw.Flush();
            sw.Close();
            sw.Dispose();
        }
每次执行都增加8k-10几k的内存资源,貌似那些所谓释放的命令都没什么效果,求大神们指点
对于.net程序来说,一下子申请10M内存,这才比较靠谱。因为这可以保证系统一次申请的内存足够使用,不需要一点点地申请。 至于你说一次增加8k内存资源,我不知道你从哪里看来的。这根本达到有必要清理的程度,就好像丰盛的一大桌子菜,如果客人吃完一点服务员就来清理一次桌面扫一次地,然后你们再继续回到桌上吃饭,这样的饭馆你敢啊?当然你希望它达到几十兆、上百兆,或者CPU有闲功夫的时候才去清理内存了啊。 你们买不起几兆内存的话,那么应该换windows95以下的操作系统。
橘色的喵 2013-07-06
  • 打赏
  • 举报
回复
一般都是用using吧,没关注过内存,mark
  • 打赏
  • 举报
回复
GC回收可以在runtime配置节中指定。大多数时候不用,即采用的是.Net的缺省配置。正因为如此,为了适应大多数软件,缺省配置即不能过于苛刻,又不能过于严谨,必须将内存调度保持一个合理的吞吐量,否则反而会因为节省少量内存的而大幅降低性能。特别是非托管资源,它们会在第一时间释放文件句柄,但并不会马上就回收(调用析构函数)释放 如果你试下执行200次以上,比如500之类的,你就会发现,当执行到大约100多次之后,进程内存便不再增长,即使后面再执行500多次,它也稳定不变,或者偶尔少量增加一点。程度耗资源不是很多的情况下,首先是将对象作标记,一代一代的"迁移" 竟然不没结贴,自己也不知道去查一下 具有finalize method的对象在垃圾回收时,.NET先调用finalize method,然后再进行回收,具体处理如下: a). 在heap创建具有finalize method的对象时,对象指针会放入finalization queue; b). 垃圾回收时,具有finalize method的对象如果成为unreachable,则将其指针从finalization queue中移除,放入freachable queue,在本次垃圾回收处理中并不对这些对象进行回收;其它没有finalize method的unreachable对象正常回收。freachable queue中的对象是reachable的(它引用到的其他对象也都是reachable的) c). 垃圾回收结束后,如果freachable queue非空,则一个专门的运行时线程finalizer thread被唤醒,它逐个调用freachable queue中对象的finalize method,然后将其指针从freachable queue中移除 d). 经过步骤c的处理之后,第二次垃圾回收时这些对象就成为unreachable,被正常回收 因为finalize method被设计用于非托管资源的释放,对这些资源的释放可能需要较长的时间,为了优化垃圾回收处理的性能,因此将调用finalize method专门交给一个独立的线程finalizer thread异步进行处理,这样也造成finalize method的对象需要经过2次垃圾回收处理 0代和1代垃圾回收主要由阀值控制。初始时Gen 0 heap大小与CPU缓存的大小相关,运行时CLR根据内存请求状态动态调整Gen 0 heap大小,但Gen 0和Gen 1总大小保持在16M左右 Gen 2 heap和LOH都在full GC时进行回收,full GC主要由2类事件触发: a). 进入Gen 2 heap和LOH的对象很多,超过了一定比例。RegisterForFullGCNotification的参数 maxGenerationThreshold、largeObjectHeapThreshold可以分别为Gen 2 heap和LOH设定这个值 b). 操作系统内存吃紧的时候。CLR会接收到操作系统内存紧张的通知消息,触发full GC
yqb_last 2013-07-05
  • 打赏
  • 举报
回复
有可能不是StreamWriter的原因啊感觉程序拉起不懂 内存也在增加,你使用 using(StreamWriter sw = new StreamWriter("f://test.txt", true, Encoding.Default)) { sw.WriteLine("ABCD"); } 试下
yqb_last 2013-07-05
  • 打赏
  • 举报
回复
尝试了不知道留个记号,在后添加GC回收也没用
goto_code 2013-07-05
  • 打赏
  • 举报
回复
引用 5 楼 MicrosoftCenterOfHN 的回复:
可能会有延迟吧,但内存应该不会持续增加的。 你测试过吗?点20次,进程占用会增加200K左右吗?一分钟后还是不会减少吗?
亲,点过,没减少,持续递增,好恐怖。就这样一个button按钮,亲,你可以试试。
  • 打赏
  • 举报
回复
可能会有延迟吧,但内存应该不会持续增加的。 你测试过吗?点20次,进程占用会增加200K左右吗?一分钟后还是不会减少吗?
  • 打赏
  • 举报
回复
引用 1 楼 guwei4037 的回复:
垃圾自动回收机制,资源回收,不代表立马就释放资源。
StreamWriter,非托管资源。不是自动回收的。
  • 打赏
  • 举报
回复
如果你不调用sw.Close(); sw.Dispose();,执行一次之后,下次很可能就要报错了
goto_code 2013-07-05
  • 打赏
  • 举报
回复
引用 1 楼 guwei4037 的回复:
垃圾自动回收机制,资源回收,不代表立马就释放资源。
我等的尿都憋出来了,只要程序不关闭,内存就不一直那样。点一次按钮就多增加一次。 一直这样下去,内存迟早耗光啊,好恐怖的事情。
全栈极简 2013-07-05
  • 打赏
  • 举报
回复
垃圾自动回收机制,资源回收,不代表立马就释放资源。

110,535

社区成员

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

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

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