System.Drawing.Bitmap は小さなマネージド オブジェクトです。これは、アンマネージ GDI+ API によって返され、プライベートのnativeImageフィールドに格納されたハンドルをラップします。そのハンドルからビットマップ データを見つけることは、干し草の山を探す練習です。また、そのビットマップ データは画像ファイル形式と互換性がありません。Bitmap::Save() 呼び出しだけがそれを行うことができ、必要な画像エンコーダーを実行します。
このアイデアをスクラッチします。
それ以外の場合、Bitmap オブジェクトでメモリの問題が発生することは非常に一般的です。Bitmap が IDisposable を継承していることを無視しているプログラマが多すぎます。多くの .NET プログラムを記述できますが、一度も Dispose() を呼び出したり、usingステートメントを使用したりすることはなく、プログラムは正常に実行されます。ガベージ コレクターは、それらをトラブルから守ります。ただし、Bitmap クラスは、もはや機能しない単一の .NET クラスです。問題は、それが小さいことです。ガベージ コレクションをトリガーする前に、何万ものそれらを作成できます。ほとんどの場合、ガベージ コレクターがアンマネージ GDI+ ハンドルを解放するのに十分ではありません。その結果、プログラムは非常に実行されます大量のアンマネージ メモリを使用します。プログラムが 32 ビット モードで実行されると、OOM クラッシュが発生する可能性が非常に高くなります。または、64 ビット モードでギガバイトのコミット サイズ
Windbg で迷子になる前に、まずプログラムのソース コードを注意深く確認してください。また、すべての Bitmap 変数を、対応する Dispose() 呼び出しまたはusingステートメントとペアにできることを確認します。前の画像で Dispose() メソッドを呼び出すコードなしで PictureBox.Image プロパティを割り当てるなどのことには注意してください。それ以外の場合、.NET メモリ プロファイラーは、これをデバッグするための優れたツールです。