在处理大字节数组时,我在 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;