tryYourDataSet.Clear();
GC.Collect();
GC.WaitForPendingFinalizers();

解决方案 »

  1.   

    谢谢!
    我的方法是将图片暂时存到dataset中,当图片超过一定数量的时候用
    Update更新数据库,Update后我dataset.clear了,这一步我省略了。
    我想是不是不是因为dataset的事儿?如果是那我去掉了添加图片字节数组一句后为什么内存使用正常啊?我检查了一下我的程序,确实该用clear,Dispose,或付空的地方我都用了啊!GC也用了,就是加上aRow["pic"]=图片的字节数组形式变量;这一句后内存开涨,迷茫啊!
      

  2.   

    就是一个字节数组啊!bmptobuff函数
    原形:
          byte[] bmptobuff(bmp pic) 
    aRow["pic"]=bmptobuff(pic);
      

  3.   

    byte[] bmptobuff(bmp pic) 
    aRow["pic"]=bmptobuff(pic);噢! 如果你的bmptobuff在循环之内定义的
    请移到循环之外试一下。好像你每次读一个图片都建立了一个buff
    建议给出你的程序结构来分析
      

  4.   

    解决了吗?
    试一试using语句。
    ms-help://MS.VSCC/MS.MSDNVS.2052/csref/html/vclrfUsingStatement.htm
      

  5.   

    if you do not want to use DataSet.Clear(), then you need to set the object to null before calling GC.Collect()
      

  6.   

    to:superkiller(毛毛雨)
       是啊!一开始我也怀疑是这里的问题,但是这个函数是返回的一个数组啊!移到循环之外怎么试?对了,我以前也做过一个测试,把这个buff图片
    数组做成一个固定的,也就是一直是一张图,不时时抓取图片,这样内存也就恢复正常,怀疑是这个函数的问题,但是怎么改啊?
    byte[] bmptobuff(bmp pic)
    {
         byte[] buff;  //声明
        
         *******//图片的处理,省了
         buff=memorystream.toarray();
         return buff;
    }
    to TheAres(班门斧):有些不明白to  saucer(思归):set null? 不过我已经 calling DataSet.Clear()
      

  7.   

    可以引申到我以前遇到过的一个问题!到现在还是不太明白还是上边的那个表,比如说已经是存了1000条纪录,当然图片也有,
    我现在要把这1000条纪录循环都读出来。好了,开始处理用的是SqlDataReaderwhere (SqlDataReader.read())
    { byte[] PicData = new byte[0];
        labelbs.text=SqlDataReader["bs"];
        PicData = (byte[])HfClass.SqlReader["pic"];
        int ArraySize = new int();
        ArraySize = PicData.GetUpperBound(0);
        using(System.IO.MemoryStream stream=new System.IO.MemoryStream   (PicData,true))
    {
    stream.Write(PicData,0,ArraySize+1);
    Picture.Image=new Bitmap(stream);
    }  
    PicData=null;
    }
    大家看看,这段代码是写在线程中的,运行正常,但是却不能用,运行起来
    后内存疯长,如果不加图片处理就正常。我最后是这样解决的
    在PicData=null;后加GC.Collect();就好了。
    我靠,c#不是自动内存管理吗?我picdata已经负空了,难道还要GC.Collect()来手动释放资源? 迷茫中啊!
      

  8.   

    byte[] bmptobuff(bmp pic)
    {
         byte[] buff;  //声明//就是这里了每次调用都新建了一个buff
        
         *******//图片的处理,省了
         buff=memorystream.toarray();
         return buff;
    }
      

  9.   

    这是正常现象
    到你的内存不够的时候.net就会收集垃圾了
    他不会在你的对象不用的时候就马上释放你的内存
    那时没有GC的做法
    你现在的程序如果运行正常而仅仅是内存占用的问题
    就不要做任何修改我的建议是你不要再做任何这方面的优化了,因为那不是你该做的
    当然你循环处理你的图片到一定数量,就是内存使用的比较多的时候
    调用GC.Collect()也是可以的。
      

  10.   

    有人说GC 是 God Cry
    上帝也哭泣:)不管他了。既然使用了C# and .net 
    就相信他的GC好了
      

  11.   

    谢谢大家啊!c#是这样的?superkiller(毛毛雨)用你的方法测试了一下,(现在正在测试中)不过我明天或者后天会把我的测试数据放上来的,供大家参考参考。经过这两天的测试只感觉到一个字,c#真“神”                                               ^     ^
                                                      ~
      

  12.   

    能避免使用临时的大对像时 就避开它
    不要随意调用  GC.Collect()
    GC 收集垃圾的开销特别大 会影响你的效率
    实在要用给出要回收的 代
      

  13.   

    测试结果内存没什么问题,程序运行初期内存慢慢上涨,到最后就释放了,最大没有超过130k,不过它的区间范围比较大,乍一看还以为是内存没有处理好,其实 superkiller(毛毛雨) 说的应该没有错,等一段时间后他占用的内存就释放了。
      

  14.   

    再问  superkiller(毛毛雨) 一个问题,如何指定要回收的代?
    我看了msdn,但是不是很明白。
      

  15.   

    GC.Collect()
    有一个重载的版本
    public static void Collect(
       int generation
    );小于等于 generation 的都会回收
    目前支持 0 ,1 ,2 三代其实C#执行刚启动的时候要启动很多玩意
    开始的那个内存占用很大,后来还是会有所回收的
      

  16.   

    GC.Collect()
    有一个重载的版本
    public static void Collect(
       int generation
    );小于等于 generation 的都会回收
    目前支持 0 ,1 ,2 三代其实C#执行刚启动的时候要启动很多玩意
    开始的那个内存占用很大,后来还是会有所回收的
      

  17.   

    我知道这个
    GC.Collect()
    的重载版本啊,
    但是就是这一句不明白:小于等于 generation 的都会回收
    目前支持 0 ,1 ,2 三代0,1,2 代表了什么?
    代字的含义不明白是什么!
      

  18.   

    我的理解:
    GC 进行垃圾收集时,会把它处理过但活着的对象的一个标志位加一, 这个标志就是所谓的 代(generation)。
    一般认为 留下来的都是精英,在下次收集垃圾时,他更有机会活下来。
    这是GC可能会采取一些策略,在收集垃圾时不去管那些三朝元老(反正这老不死的可能不会死,查一下它的引用反倒费事、费时),我一般不使用GC.Collect() ,要用的话也会 GC.Collect(0),只要他收集0代的对象,这样GC就不必去管那些老家伙,只用处理刚产生的垃圾。这样的命中率会更高,等待GC的时间回比较少,毕竟GC工作的时候我的程序是不能运行的。