tryYourDataSet.Clear();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
解决方案 »
- 新手求救!vs2008中增加Flash控件出问题,在线等~~
- 求服务器向多个客户端发送大量数据的演示程序。
- 请教一个关于数据库的问题
- asp.net 程序员,一个月的工资是多少?
- 关闭子窗体应该用Close()还是Dispose()
- 求:C#中 ARGB 与 HLS 色彩相互转换的方法,请各位高手赐教~~
- OPC client端 断开server后组态王崩溃
- 急!为什么在构造函数中创建自定义类型的实例会出错?
- 方法里如何递归调用传进来的控件?
- vs.net beta2的CDKey在哪张光盘上?文件名是什么?我怎么找不到,注册微软的时候要用
- string 的问题
- 在DataSet中选择性的在DataGrid中显示相应几列
我的方法是将图片暂时存到dataset中,当图片超过一定数量的时候用
Update更新数据库,Update后我dataset.clear了,这一步我省略了。
我想是不是不是因为dataset的事儿?如果是那我去掉了添加图片字节数组一句后为什么内存使用正常啊?我检查了一下我的程序,确实该用clear,Dispose,或付空的地方我都用了啊!GC也用了,就是加上aRow["pic"]=图片的字节数组形式变量;这一句后内存开涨,迷茫啊!
原形:
byte[] bmptobuff(bmp pic)
aRow["pic"]=bmptobuff(pic);
aRow["pic"]=bmptobuff(pic);噢! 如果你的bmptobuff在循环之内定义的
请移到循环之外试一下。好像你每次读一个图片都建立了一个buff
建议给出你的程序结构来分析
试一试using语句。
ms-help://MS.VSCC/MS.MSDNVS.2052/csref/html/vclrfUsingStatement.htm
是啊!一开始我也怀疑是这里的问题,但是这个函数是返回的一个数组啊!移到循环之外怎么试?对了,我以前也做过一个测试,把这个buff图片
数组做成一个固定的,也就是一直是一张图,不时时抓取图片,这样内存也就恢复正常,怀疑是这个函数的问题,但是怎么改啊?
byte[] bmptobuff(bmp pic)
{
byte[] buff; //声明
*******//图片的处理,省了
buff=memorystream.toarray();
return buff;
}
to TheAres(班门斧):有些不明白to saucer(思归):set null? 不过我已经 calling DataSet.Clear()
我现在要把这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()来手动释放资源? 迷茫中啊!
{
byte[] buff; //声明//就是这里了每次调用都新建了一个buff
*******//图片的处理,省了
buff=memorystream.toarray();
return buff;
}
到你的内存不够的时候.net就会收集垃圾了
他不会在你的对象不用的时候就马上释放你的内存
那时没有GC的做法
你现在的程序如果运行正常而仅仅是内存占用的问题
就不要做任何修改我的建议是你不要再做任何这方面的优化了,因为那不是你该做的
当然你循环处理你的图片到一定数量,就是内存使用的比较多的时候
调用GC.Collect()也是可以的。
上帝也哭泣:)不管他了。既然使用了C# and .net
就相信他的GC好了
~
不要随意调用 GC.Collect()
GC 收集垃圾的开销特别大 会影响你的效率
实在要用给出要回收的 代
我看了msdn,但是不是很明白。
有一个重载的版本
public static void Collect(
int generation
);小于等于 generation 的都会回收
目前支持 0 ,1 ,2 三代其实C#执行刚启动的时候要启动很多玩意
开始的那个内存占用很大,后来还是会有所回收的
有一个重载的版本
public static void Collect(
int generation
);小于等于 generation 的都会回收
目前支持 0 ,1 ,2 三代其实C#执行刚启动的时候要启动很多玩意
开始的那个内存占用很大,后来还是会有所回收的
GC.Collect()
的重载版本啊,
但是就是这一句不明白:小于等于 generation 的都会回收
目前支持 0 ,1 ,2 三代0,1,2 代表了什么?
代字的含义不明白是什么!
GC 进行垃圾收集时,会把它处理过但活着的对象的一个标志位加一, 这个标志就是所谓的 代(generation)。
一般认为 留下来的都是精英,在下次收集垃圾时,他更有机会活下来。
这是GC可能会采取一些策略,在收集垃圾时不去管那些三朝元老(反正这老不死的可能不会死,查一下它的引用反倒费事、费时),我一般不使用GC.Collect() ,要用的话也会 GC.Collect(0),只要他收集0代的对象,这样GC就不必去管那些老家伙,只用处理刚产生的垃圾。这样的命中率会更高,等待GC的时间回比较少,毕竟GC工作的时候我的程序是不能运行的。