0

在处理大字节数组时,我在 WP8 模拟器上看到了一些奇怪的 GC 行为,即内存没有被释放,也没有被重用。

示例:我的应用程序的内存使用基线约为 17MB。如果我再分配一个 50MB 字节数组,内存使用量将如预期的那样增加到 67MB。我将字节数组重新初始化为零大小并调用 GC.Collect() 这不会减少总内存使用量。这是预期的;内存不会释放回 Windows,只是标记为可重用。如果然后我将字节数组重新初始化为相同的大小,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 回答