我有一个OOM问题。我试图确定使用WinDbg导致OOM异常的原因但我没有成功。
我有一个带有Infragistics ultragrid的Windows窗体,可以加载11000行。每行都会删除一个删除位图。我无法在许多机器上重现它,但客户经常报告,所以我要求内存转储
我需要帮助才能更进一步。
我有一个大小= 1.9 GB的内存转储。
我按照下面的步骤进行操作:
.loadby sos clr
!线程
!pe 3c61f7d0
!dumpheap -stat
它似乎不是OOM的候选类型
我跑了!dumpheap -min 85000 -stat以确定哪些对象使用超过85k的内存而且我得到了:
统计:
MT Count TotalSize Class Name
0028cd20 1 438732免费
共1个对象
!finalizequeue
答案 0 :(得分:2)
您是如何得出OOM问题的?例外?有什么例外?调试器输出?什么调试器输出?
1.9 GB的内存转储非常大。这使得你的OOM很可能是由内存不足引起的.....在你喊出之前是其他抛出OutOfMemory异常的东西。
如果没有超过85k的托管对象,则它是非托管内存或大量小于85k的对象。例如,这可以是地图,链表或树或类似物,或您自己的对象层次结构。
如果它是非托管内存,那么最佳候选者肯定会是位图。加载11000个位图似乎不是一个非常好的主意。我建议你不要这样做 - 为什么不使用像“x”或类似的东西?
此外,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;
}