Graphics.DrawImage OutOFMemory Exception

时间:2011-03-07 06:12:00

标签: c# .net asp.net gdi+ out-of-memory

我在尝试调整较大图片的大小时遇到​​OutOfMemory异常。我们的服务器只能调整小于1000x1000像素的图像。我的开发机器似乎处理任何大小,其他开发人员机器似乎与服务器具有相同的限制。我的开发机器也是最好的规格。

我觉得这段代码可以正确处理所有对象,但我可能错了。我尝试过使用perfmon查看.Net CLR内存,但我不确定如何解释结果。

我很困惑如何最好地解决这个问题,并就问题存在的原因得到明确的答案。任何调试的想法将不胜感激。

编辑:g.DrawImage

上发生错误
using(Image imgToResize = Image.FromFile(path))
        {
            using (Bitmap b = new Bitmap(ResizeWidth, ResizeHeight, PixelFormat.Format24bppRgb))
            {
                using(Graphics g = Graphics.FromImage(b))
                {
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.DrawImage(imgToResize, 0, 0, ResizeWidth, ResizeHeight);
                    b.Save(DiskPathThumb(maxSize), ImageFormat.Jpeg);
                }
            }
        }

2 个答案:

答案 0 :(得分:1)

你能截取PrivateBytes,LOH尺寸,#Gen 2系列的计数器吗?

这是什么类型的应用程序?这对您的应用程序代码有多深?你在LOH有多少件物品?由于正在返回的缓冲区肯定属于大对象。你有没有看过这个调用触发时的调用堆栈,堆的状态和碎片?

FWIW,您可以在使用GDI的C或C ++版本中尝试相同的代码。您正在使用的每个图形相关函数都是GDI的包装器,并且测试在故障机器上的测试应用程序中将有助于将内容缩小到.Net Framework而不是其他内容。

我无法获得OOM异常,但是在函数抛出InvalidParameterException之前,我可以传递的最大值是19866x19866。这是一个64位Win7,目标是.Net 4 w / VS2010。

答案 1 :(得分:0)

原来这与我们使用SessionPageStatePersister的某种方式有关,这导致我们的gen2堆栈随着时间的推移稳步上升,并且在应用程序池被回收之前的某个时刻我们的系统无法处理得很多。

我们已经恢复到标准的隐藏视野状态,这个错误消失了。