不使用所有内存/限制时内存不足

时间:2015-10-14 10:30:45

标签: c# .net memory-management memory-leaks out-of-memory

我们在这里有一个问题,我们可以有一些<ul id="menu-start" class="menu"> <li id="menu-item-21" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-4 current_page_item menu-item-21"><a href="http://oneconsultant.se/ninas/">START</a> </li> <li id="menu-item-20" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20"><a href="http://oneconsultant.se/ninas/om-hundsalongen/">OM HUNDSALONGEN</a> </li> <li id="menu-item-17" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-17"><a href="http://oneconsultant.se/ninas/boka-tid/">BOKA TID</a> </li> <li id="menu-item-16" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-16"><a href="http://oneconsultant.se/ninas/aktuellt/">AKTUELLT</a> </li> <li id="menu-item-19" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-19"><a href="http://oneconsultant.se/ninas/kontakta-oss/">KONTAKTA OSS</a> </li> </ul>

我们会检查如何减少内存使用量,但我的问题是为什么我此时

根据内存分析器和Windows任务管理器,应用程序权重 400MB。

对于我理解的内容(confirmed here),对于32位应用程序,限制应该在2GB左右。我的电脑有16GB的内存,并且有足够的内存(超过4GB)。

那么为什么我现在会收到这个错误?

我的问题不是为什么我的应用程序的内存增长,而是更多地了解为什么它现在已经发生了。 我觉得这个限制不是固定的,但我找不到任何参考。

调用堆栈如果有帮助:

OutOfMemoryException

修改 我得到了完全不同的堆栈跟踪相同的异常:

System.OutOfMemoryException: Out of memory.
   at System.Drawing.Graphics.CheckErrorStatus(Int32 status)
   at System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y, Int32 width, Int32 height)
   at Nevron.GraphicsCore.NBitmapGdiRenderSurface.Paint(Object sender, PaintEventArgs e, l1ll11Il1 contentPainter)
   at Nevron.Chart.WinForm.NControlView.Paint(Object sender, PaintEventArgs e)
   at Nevron.Chart.WinForm.NChartControl.OnPaint(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.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)

2 个答案:

答案 0 :(得分:5)

一种可能性是您的大对象堆已经碎片化。即它有足够的空间,但没有足够大的空间来满足大型物体的分配。

虽然似乎有办法one off compaction now,但LOH通常不会被压缩。

如果确实存在问题,那么避免LOH碎片的一种方法是使用大型对象池,这些对象只有在完成后才会返回池中,而不是让GC处理它们。

答案 1 :(得分:4)

您可能会看到内存碎片的结果。例如,如果你总共拥有2GB的空闲内容,那就会发生这种情况,但是你最大的内存块比这个小得多,例如200MB。然后你尝试分配一个400MB的块并获得内存不足的异常。

此外,如果您正在使用GDI +,它有一种讨厌的习惯,即在各种情况下都会丢失内存异常,其中大部分与内存无关。

刚刚看了你的踪迹,很容易就是我提到的GDI +的一些奇迹。在过去,我已经发生了文件权限,比如加载位图时。如果我是你,那就是我要检查的。不是特定的文件权限,而是已知GDI +吐出OOM异常的情况。