【发布时间】:2014-01-03 11:00:13
【问题描述】:
如果我有一个要修剪的列表以节省内存,我似乎可以设置列表容量,然后等待 GC 释放内存。当 List 升级到下一代时,为其分配的内存似乎是列表容量的函数,而不是最初分配的内存。这节省了我明确的复制,最终意味着总共减少了 1 个副本。
var x = new List<double>(50000000) { 1, 2, 3 };
//Lots of memory used here
GC.Collect(2);
//Still lots of memory used
x.Capacity = 3;
GC.Collect(2);
//Much less memory now used
是否可以用数组以某种方式做同样的事情?
请注意,我不打算显式强制 GC - 这只是为了说明当 GC 最终发生时,内存被释放。
【问题讨论】:
-
没有。你可以自己“缩小”它stackoverflow.com/questions/12231569/…
-
嗯 VB.NET 确实有
ReDim Preserve,但我不在电脑前使用 Reflector 来确认它是如何完成的。 -
我认为您假设设置容量不是将内部数组复制到较小的数组
-
ReDim 创建一个新的数组副本——它只是语法糖msdn.microsoft.com/en-us/library/w8k3cys2.aspx
-
@JamesB - 是的,你是对的。这个问题现在变得无关紧要了。
标签: c# arrays list garbage-collection