在System.Drawing.Graphics.FromHdcInternal中没有内存异常但没有内存泄漏

时间:2011-03-02 10:30:01

标签: .net out-of-memory

我偶尔会遇到以下痕迹:

System.OutOfMemoryException: Out of memory.
   at System.Drawing.Graphics.FromHdcInternal(IntPtr hdc)
   at System.Windows.Forms.PaintEventArgs.get_Graphics()
   at System.Windows.Forms.Control.PaintBackColor(PaintEventArgs e, Rectangle rectangle, Color backColor)
   at System.Windows.Forms.Control.PaintBackground(PaintEventArgs e, Rectangle rectangle, Color backColor, Point scrollOffset)
   at System.Windows.Forms.Control.PaintBackground(PaintEventArgs e, Rectangle rectangle)
   at System.Windows.Forms.Control.OnPaintBackground(PaintEventArgs pevent)
   at System.Windows.Forms.ScrollableControl.OnPaintBackground(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.WmEraseBkgnd(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)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

正如你可以看到我的代码中没有任何代码,所以我发现很难找到原因。谷歌搜索似乎没有结果,但通常指向某个地方的GC句柄泄漏但是在最近的崩溃之后我的内存使用情况是:

Handle count:16,283, 
Private Bytes:995,440K, 
Virtual Bytes:1,628,208K, 
Working Set:866,892K, 
GC Heap Size:158,841K, 
GDI Objects:402, 
User Objects:1,607 

这似乎与众不同。另外,我经常使用.net内存分析器来管理泄漏。

不幸的是,我的应用程序非常庞大,有很多窗口,所以我的第一个问题是:我怎样才能确定哪个窗口造成了所有的痛苦?

然后当然我的第二个问题是:如果没有句柄泄漏,导致异常的是什么!?

修改

很抱歉,我无法发布任何代码:它是一个庞大的代码库,例外并没有给我任何关于哪个部分可能是问题的线索。

我读到关于句柄有10,000个限制,但这个应用程序历来总是运行15,000,所以我假设限制是在其他东西:GDI句柄或用户对象可能?

为了确保,我检查过并且手柄没有泄漏,因为它们都是在启动时分配的,并且不会因使用而增加。

让我修改一下我的问题:鉴于这些信息,下一步行动应该是什么?我安装了进程资源管理器并成功从其中一个崩溃中获取完整的内存转储但是真的没有使用任何一种来诊断这类问题的经验(直到现在.net内存分析器已经足够了)

3 个答案:

答案 0 :(得分:3)

您可能正在分配画笔或笔并且没有处理它们 - 这会消耗GDI句柄,并且在某些时候,所有这些句柄都被使用并且您获得OutOfMemoryException。

答案 1 :(得分:0)

由于我们无法看到代码,因此可能出现该错误。它发生在我身上。

确保您正在调用正确的方法。我试图从HDC获得一个Graphics对象,我应该选择接受HWND的方法重载。由于这些句柄之间没有任何类型的检查,因此很容易在这里出现这些错误。

答案 2 :(得分:0)

该聚会迟到了,但万一其他人到了这里,但是有一个Hotfix发布了: https://support.microsoft.com/en-us/help/2650146/fix-outofmemoryexception-exception-when-you-use-a-graphics-object-to-p

FIX:当您使用图形对象进行OutOfMemoryException异常 在基于.NET Framework 3.5的Windows窗体应用程序中绘画 到:.NET Framework 3.5 Service Pack 1

症状 请考虑以下情形:

  • 您创建一个Microsoft .NET 计算机上基于Framework 3.5的图形密集型应用程序 正在运行Windows 7或Windows Server 2008 R2。
  • 应用程序使用 图形设备界面(GDI)。
  • 您创建一个图形对象,然后 然后用它来绘画。在这种情况下,您可能会遇到 OutOfMemoryException异常。此外,您还会收到 以下错误消息:

异常类型:System.OutOfMemoryException消息:内存不足。

当您调试此问题时,您会收到类似于 以下:

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

在System.Windows.Forms.PaintEventArgs.get_Graphics()

要解决:

现在可以从Microsoft获得支持的修补程序。但是,这是 旨在仅纠正本文描述的问题。 仅将其应用于遇到此特定问题的系统。

要解决此问题,请与Microsoft客户支持服务联系。 获取此修复程序。有关Microsoft客户的完整列表 支持服务电话号码和有关支持的信息 费用,请访问下面的Microsoft网站: http://support.microsoft.com/contactus/?ws=support