1. ホーム
  2. .net

[解決済み] .net の OOM 問題を解決する必要があります。

2022-03-10 09:12:34

質問内容

OOMの問題があります。WinDbgを使用してOOM Exceptionの原因を突き止めようとしましたが、うまくいきませんでした。

Infragistics のウルトラグリッドで、11000行を読み込むウィンドウズフォームがあります。各行は、削除ビットマップを描画します。 私は多くのマシンでそれを再現することはできませんが、クライアントが非常に頻繁に報告したので、私はメモリダンプを要求しました。

さらに上を目指すには、助けが必要です。

サイズ=1.9GBのメモリダンプがあります。

以下のステップに従いました。

.loadby sos clr

!スレッド

!pe 3c61f7d0

!ダンプヒープ -stat

OOMのタイプ候補にはならないようです。

どのオブジェクトが85k以上のメモリを使用しているかを把握するために、!dumpheap -min 85000 -statを実行したところ、以下のようになりました。

統計情報です。

  MT      Count    TotalSize    Class Name

0028cd20 1 438732 無料

合計 1 オブジェクト

!finalizequeue

解決方法は?

問題は、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;
}