本帖最后由 andyqq8 于 2011-05-25 06:08:42 编辑

解决方案 »

  1.   


    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是好习惯。
      

  2.   

    for (int i = 0; i < 4800000; i++)
                    {
                     Color rgb= img.GetPixel(100, 100);
                    }
    因为Color是值类型,每次执行一次都进栈出栈释放很快,内存自然不受影响。
    Bitmap是引用类型,由GC回收。
      

  3.   

    虽然还是一知半解,但大概料懂原理了,谢谢两位,工作happy!
      

  4.   

    “只建了一个img,后面100次new Bitmap应该类似于ie的"f5"键刷新而已呀”——
    大哥,您这个理解想当然了
      

  5.   


    //你这一行代码每次就产生约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;
                    }