大きなバイト配列を操作しているときに、WP8 エミュレーターで奇妙な GC の動作が見られます。つまり、メモリが解放されず、再利用されません。
例: アプリケーションのメモリ使用量のベースラインは ~17MB です。次に、50MB のバイト配列を割り当てると、メモリ使用量は予想どおり 67MB に増加します。バイト配列をサイズ 0 に再初期化して GC.Collect() を呼び出しますが、総メモリ使用量は減りません。これは予想どおりです。メモリはウィンドウに解放されず、再利用可能としてフラグが立てられるだけです。次に、バイト配列を同じサイズの 50MB に再初期化すると、メモリが再利用され、合計メモリ使用量が増加しないことが予想されます。右?間違い。メモリは再利用されず、合計メモリ使用量は 117 MB になりました。以下のサンプルコードを参照してください。
誰でもこれを説明できますか?まったく同じバイト数を割り当てているので、問題は LOH フラグメンテーションに起因するものではありませんよね?
// memory usage = 17MB
var tb = new byte[1024*1024*50];
// memory usage = 67MB
tb = new byte[0];
GC.Collect();
// memory usage = 67MB
tb = null;
GC.Collect();
// memory usage = 67MB
tb = new byte[1024*1024*50];
// memory usage = 117MB
GC.Collect();
// memory usage = 117MB;