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

解决方案 »

  1.   

    如果你不调用sw.Close();
                sw.Dispose();,执行一次之后,下次很可能就要报错了
      

  2.   


    StreamWriter,非托管资源。不是自动回收的。
      

  3.   

    亲,点过,没减少,持续递增,好恐怖。就这样一个button按钮,亲,你可以试试。
      

  4.   

    有可能不是StreamWriter的原因啊感觉程序拉起不懂 内存也在增加,你使用
    using(StreamWriter sw = new StreamWriter("f://test.txt", true, Encoding.Default))
    {
        sw.WriteLine("ABCD");
    }
    试下
      

  5.   

    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
      

  6.   

    一般都是用using吧,没关注过内存,
      

  7.   


    对于.net程序来说,一下子申请10M内存,这才比较靠谱。因为这可以保证系统一次申请的内存足够使用,不需要一点点地申请。至于你说一次增加8k内存资源,我不知道你从哪里看来的。这根本达到有必要清理的程度,就好像丰盛的一大桌子菜,如果客人吃完一点服务员就来清理一次桌面扫一次地,然后你们再继续回到桌上吃饭,这样的饭馆你敢啊?当然你希望它达到几十兆、上百兆,或者CPU有闲功夫的时候才去清理内存了啊。你们买不起几兆内存的话,那么应该换windows95以下的操作系统。
      

  8.   

    建议你看看Clr via C# 中垃圾回收章节,你调用Dispose方法只是释放本地资源,即文件句柄,然而内存中的并没有被清楚,你可以每次显示把sw设置为null的方式看看内存的使用情况的