意外的GC行为

时间:2013-04-13 18:28:41

标签: c# memory-leaks garbage-collection windows-phone-8 bytearray

在使用大字节数组时,我在WP8仿真器上看到了一些奇怪的GC行为,即内存未释放,也未重用。

实施例: 我的应用程序的内存使用基线大约是17MB。如果我再分配一个50MB字节的数组内存,则会按预期使用量增加到67MB。我将字节数组重新初始化为零,并调用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;

1 个答案:

答案 0 :(得分:1)

我尝试使用一个按钮来重复分配,第一次点击或多或少就像你描述的那样,但之后内存使用是平的。

因此,您的观察结果很可能受到启动问题以及可能在后台发生的分配的干扰。

从更广泛的角度来看,GC的行为符合预期。