2011-05-10 185 views
0

在程序啓動過程中偶爾出現內存異常。堆棧跟蹤如下。我只在客戶機器上得到這個崩潰。內存不足異常

我應該遵循哪些步驟來確定根本原因?

[369][4/29/2011 18:32:15:343]-ERR -[ThreadId = 7916, UIFramework_ICEVisionPro_GUIExceptionHandler.LogException]-System.OutOfMemoryException: Out of memory. 

    at System.Drawing.Graphics.FromHdcInternal(IntPtr hdc) 

    at System.Drawing.BufferedGraphicsContext.CreateBuffer(IntPtr src, Int32 offsetX, Int32 offsetY, Int32 width, Int32 height) 

    at System.Drawing.BufferedGraphicsContext.AllocBuffer(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle) 

    at System.Drawing.BufferedGraphicsContext.AllocBufferInTempManager(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle) 

    at System.Drawing.BufferedGraphicsContext.Allocate(IntPtr targetDC, Rectangle targetRectangle) 

    at System.Windows.Forms.Control.WmPaint(Message& m) 

    at System.Windows.Forms.Control.WndProc(Message& m) 

    at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 

    at System.Windows.Forms.ContainerControl.WndProc(Message& m) 

    at System.Windows.Forms.UserControl.WndProc(Message& m) 

    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 

    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
+0

你正在做任何'位圖'對象和處理相同?如果是這樣,我相信沒有足夠的內存可用於執行相同的進程 – V4Vendetta 2011-05-10 07:54:55

+0

您是否處置所有非託管資源? – dandan78 2011-05-10 07:56:52

+0

@ dandan78:我不確定。這是因爲有些屏幕是我們開發的,有些是由客戶開發的。是否有任何工具可以確定是否在應用程序中的非託管資源上調用了dispose? – Maanu 2011-05-10 08:01:39

回答

2

使用一個體面的內存分析器來幫助查找問題

0

的根本原因,從跟蹤上述我知道你正在使用Windows.Forms的。 Windows窗體程序中的內存泄露可能是因爲忘記取消訂閱關閉表單(訂閱者阻止處理表單)的事件。有 a few articlestutorials這表明這是一個在窗體編程中很常見的錯誤,所以可能你可以檢查出來。當然,已經說過,它可能不太適合你的情況(在程序啓動時出現mem)。

如果託管代碼中發生內存泄漏,使用內存分析器可能是一個好主意。我主要使用的是ANTS Mem Profiler,它具有很好的圖表和統計數據,並且比大多數用戶界面更友好。

但是,如果泄漏發生在非託管代碼(like for this guy here)中,您可以搭便車。 This article可能會幫助你開始。

總而言之,您可能需要大量閱讀,試圖理解.net應用程序中的內存管理,gc世代如何工作等等,而這一切都會讓您花費大量時間。

祝你好運!