我需要解决.net OOM问题

时间:2013-07-22 13:50:25

标签: .net out-of-memory

我有一个OOM问题。我试图确定使用WinDbg导致OOM异常的原因但我没有成功。

我有一个带有Infragistics ultragrid的Windows窗体,可以加载11000行。每行都会删除一个删除位图。我无法在许多机器上重现它,但客户经常报告,所以我要求内存转储

我需要帮助才能更进一步。

我有一个大小= 1.9 GB的内存转储。

我按照下面的步骤进行操作:

.loadby sos clr

!线程

threads

!pe 3c61f7d0

print exception

!dumpheap -stat

dumpheap stat

它似乎不是OOM的候选类型

我跑了!dumpheap -min 85000 -stat以确定哪些对象使用超过85k的内存而且我得到了:

统计:

  MT      Count    TotalSize    Class Name

0028cd20 1 438732免费

共1个对象

!finalizequeue finalize queue 1 finalize queue 2

2 个答案:

答案 0 :(得分:2)

  1. 您是如何得出OOM问题的?例外?有什么例外?调试器输出?什么调试器输出?

  2. 1.9 GB的内存转储非常大。这使得你的OOM很可能是由内存不足引起的.....在你喊出之前其他抛出OutOfMemory异常的东西。

  3. 如果没有超过85k的托管对象,则它是非托管内存或大量小于85k的对象。例如,这可以是地图,链表或树或类似物,或您自己的对象层次结构。

  4. 如果它是非托管内存,那么最佳候选者肯定会是位图。加载11000个位图似乎不是一个非常好的主意。我建议你不要这样做 - 为什么不使用像“x”或类似的东西?

  5. 此外,Resources.Resources.delete做了什么?它看起来像一个属性get,但它每次加载位图,还是加载一次并使用相同的位图?如果每次加载它,那么......不要。如果它重用它表明网格正在为每一行创建一个新网格,它实际上不应该这样做。

答案 1 :(得分:0)

问题是我如何配置Infragistics网格。 答案也在此链接中记录:

http://www.infragistics.com/community/forums/t/56315.aspx

导致OOM问题的代码是:

private static void ConfigureDeleteColumnOn(UltraGridBand band)
{
    band.Columns.Add(DELETE_BUTTON);
    band.Columns[DELETE_BUTTON].EditorControl = GetDeleteButtonEditor();
}

private static Control GetDeleteButtonEditor()
{
    UltraTextEditor editor = new UltraTextEditor();
    EditorButton btn = new EditorButton
                        {
                            Appearance =
                                {
                                    Image = Resources.Resources.delete,
                                    ImageBackgroundStyle = ImageBackgroundStyle.Centered
                                }
                        };
    editor.EditorButtonClick += editor_EditorDeleteButtonClick;
    editor.ButtonsLeft.Add(btn);
    return editor;
}

此代码强制网格为每个单元格创建一个新的位图。有11000行,网格尝试创建11000位图并导致OOM异常。

解决方案是:

private static void ConfigureDeleteColumnOn(UltraGridBand band)
{
    band.Columns.Add(DELETE_BUTTON);
    band.Columns[DELETE_BUTTON].ButtonDisplayStyle = ButtonDisplayStyle.Always;
    band.Columns[DELETE_BUTTON].Style = ColumnStyle.Button;
    band.Columns[DELETE_BUTTON].CellButtonAppearance.Image = Resources.Resources.delete;
}