2011-03-07 116 views
2

尝试调整较大图像的大小时出现OutOfMemory异常。我们的服务器只能调整小于1000x1000像素的图像。我的开发机器似乎处理任何大小,其他开发人员机器似乎有与服务器相同的限制。我的开发机器也是最好的spec'd。Graphics.DrawImage OutOFMemory异常

我觉得这段代码能正确处理所有的对象,但我可能是错的。我已经尝试使用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); 
       } 
      } 
     } 
+0

您在OnPaint事件中调用此代码的位置? – Arseny 2011-03-07 07:21:21

+0

将其调用的发布文件上传到服务器。有时候甚至在缩略图被请求时甚至不会上传它。无论哪种方式都会得到相同的结果。 – 2011-03-07 09:33:37

+1

它失败了什么?它总是一样的吗?另外,ResizeWidth和ResizeHeight的值是什么?有时GDI +会抛出内存不足的异常,这些异常并不是真正的内存不足异常。 – rsbarro 2011-03-08 08:08:20

回答

0

事实证明,这与我们使用SessionPageStatePersister相关,这导致我们的gen2堆栈随着时间推移稳步上升,并且在应用池被回收之前的某个时间点,我们的系统根本无法处理。

我们已经恢复到标准隐藏字段视图状态,并且此错误消失。

1

你能截图供PrivateBytes,LOH大小柜台,#Gen 2个集错误:

编辑?

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

FWIW,您可以在使用GDI的C或C++版本中尝试相同的代码。你使用的每一个图形相关函数都是GDI的一个包装器,并且在测试失败的机器上的应用程序中测试,将有助于缩小到.Net Framework的范围,而不是别的。

我无法获得OOM异常,但是我可以传递的最大值大约在19866x19866之前,该函数将引发InvalidParameterException。这是针对.Net 4 w/VS2010的64位Win7目标。

+0

我使用了其中的一些技巧,感谢您的帮助。 – 2011-05-01 00:23:26