关于new Bitmap,不是只有一个img吗?为什么不进行Dispose()内存就会不断增加直至"虚拟内存不足"而崩掉? 本帖最后由 andyqq8 于 2011-05-25 06:08:42 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 private void button1_Click(object sender, EventArgs e) { Image img = null; for (int i = 0; i < 100; i++) { img = new Bitmap(1440, 900); //img.Dispose(); //Diepose了就是正常设想的不加内存的 } }使用完 Image 后调用 Dispose。 Dispose 方法使 Image 处于不可用状态。 调用完 Dispose 后,必须释放对 Image 的所有引用,这样垃圾回收器才能收回 Image 占用的内存。只声明了一个Image img当第一次执行img = new Bitmap(1440, 900);时这个img是能找到对象的。当第二次执行img = new Bitmap(1440, 900);时第一次new的Bitmap变找不到了,因为它的引用(可以想象成指针)被覆盖了,只想了新的BitMap也就说你在循环是只有最后一次img = new Bitmap(1440, 900);的对象是有效的,能引用到的。在此之前的都引用不到了,CLR会检查它们的引用计数,如果没有线程引用它们了,就做标记,在GC垃圾回收时,回收内存。可是垃圾回收不是实时运行的。在你new Bitmap新的对象时,垃圾回收可能还没运行,标记回收的对象还在内存中,如果内存不够用,CLR会把一些不经常引用的对象置换到虚拟内存,腾出内存供最新对象使用。你不断的置换页面,很快填满了虚拟内存。我认为即使不Dispose的话,内存最后也会释放,只是时间要久一些。Dispose是好习惯。 for (int i = 0; i < 4800000; i++) { Color rgb= img.GetPixel(100, 100); }因为Color是值类型,每次执行一次都进栈出栈释放很快,内存自然不受影响。Bitmap是引用类型,由GC回收。 虽然还是一知半解,但大概料懂原理了,谢谢两位,工作happy! “只建了一个img,后面100次new Bitmap应该类似于ie的"f5"键刷新而已呀”——大哥,您这个理解想当然了 //你这一行代码每次就产生约4.94MB内存。。img = new Bitmap(1440, 900);for (int i = 0; i < 4800000; i++) { Color rgb= img.GetPixel(100, 100); }// 你上面这个循环和下面的没什么区别for (int i = 0; i < 4800000; i++) { int n = 0; } DataGridView单元格的值问题 关于xsd文件的应用 c# 使用Parameters方式更新Access数据库 SQL 查询不重复 急急,关于用timer 控制Picturebox 播放图片的控件 C#新手 送分啦..一个简单的问题. 关于.NET PPC发布问题 Asp.net(C#) 如何抓 sql server 异常 高分请教大家一个有关报表的问题!(在线) HTTP头设置了gzip,deflate,能否对部分数据进行解压? 求vs2010的下载地址
private void button1_Click(object sender, EventArgs e)
{
Image img = null;
for (int i = 0; i < 100; i++)
{
img = new Bitmap(1440, 900);
//img.Dispose(); //Diepose了就是正常设想的不加内存的
} }使用完 Image 后调用 Dispose。 Dispose 方法使 Image 处于不可用状态。 调用完 Dispose 后,必须释放对 Image 的所有引用,这样垃圾回收器才能收回 Image 占用的内存。只声明了一个Image img
当第一次执行img = new Bitmap(1440, 900);时
这个img是能找到对象的。
当第二次执行img = new Bitmap(1440, 900);时
第一次new的Bitmap变找不到了,因为它的引用(可以想象成指针)被覆盖了,只想了新的BitMap
也就说你在循环是只有最后一次img = new Bitmap(1440, 900);的对象是有效的,能引用到的。
在此之前的都引用不到了,CLR会检查它们的引用计数,如果没有线程引用它们了,就做标记,在GC垃圾回收时,回收内存。
可是垃圾回收不是实时运行的。在你new Bitmap新的对象时,垃圾回收可能还没运行,标记回收的对象还在内存中,如果内存不够用,CLR会把一些不经常引用的对象置换到虚拟内存,腾出内存供最新对象使用。你不断的置换页面,很快填满了虚拟内存。我认为即使不Dispose的话,内存最后也会释放,只是时间要久一些。
Dispose是好习惯。
{
Color rgb= img.GetPixel(100, 100);
}
因为Color是值类型,每次执行一次都进栈出栈释放很快,内存自然不受影响。
Bitmap是引用类型,由GC回收。
大哥,您这个理解想当然了
//你这一行代码每次就产生约4.94MB内存。。
img = new Bitmap(1440, 900);
for (int i = 0; i < 4800000; i++)
{
Color rgb= img.GetPixel(100, 100);
}
// 你上面这个循环和下面的没什么区别
for (int i = 0; i < 4800000; i++)
{
int n = 0;
}