0

大きなバイト配列を操作しているときに、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;
4

1 に答える 1

1

割り当てを繰り返すボタンでこれを試しました。最初のクリックは多かれ少なかれあなたが説明したように機能しますが、その後のメモリ使用量はフラットです。

そのため、起動時の問題や、バックグラウンドで発生している割り当てによって、観測が妨げられる可能性が最も高くなります。

より広い観点から、GC は期待どおりに動作します。

于 2013-04-13T18:58:38.337 に答える