日期:2014-05-17  浏览次数:21190 次

StreamWriter资源无法释放

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的内存资源,貌似那些所谓释放的命令都没什么效果,求大神们指点

------解决方案--------------------
垃圾自动回收机制,资源回收,不代表立马就释放资源。
------解决方案--------------------
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的对象很多,超过了一定比例