2011-03-07 185 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