我在程序启动期间偶尔会出现内存异常。堆栈跟踪如下所示。我只是在客户机器上遇到此崩溃。
我应该遵循哪些步骤来确定根本原因?
[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 :(得分:2)
使用合适的内存分析器来帮助找到问题的根本原因
答案 1 :(得分:0)
从上面的描述中我了解到你正在使用windows.forms。 Windows窗体程序中的内存泄漏可能是由于忘记在关闭表单时取消订阅事件(订阅者阻止处理表单)。有 a few articles和tutorials表明这是表单编程中非常常见的错误,因此您可以查看它。当然,说到这一点,它可能不适合你的情况(程序启动时发生的故障)。
如果托管代码中发生内存泄漏,使用内存分析器可能是个好主意。我主要使用ANTS Mem Profiler,它有很好的图形和统计数据以及比大多数人更友好的用户界面。
但是,如果泄漏发生在非托管代码(like for this guy here)中,那么您就可以乘坐。 This article可能会帮助您入门。
总而言之,在尝试理解.net应用程序中的内存管理,gc代的工作方式等方面,你可能会有很多阅读,所有这些都会耗费你很多时间。 祝你好运!