我有这样的东西:
List<object> res = new List<object>();
...
while (...)
{
byte[] val = //get new byte[4]
res.Add(val); //if this is commented memory usage goes from 2Gb to 180Mb
}
return res;
现在
val
总是byte[4],大约有37000000个元素。所以我认为res
应该在37*10^6 * 4字节左右 = 148 MB,但实际的内存使用量约为2GB。如果我注释掉res.Add(val);
,那么内存使用量会在100 MB左右。那么内存去哪了呢?
编辑
编辑2
好的,使用uint代替byte [4] 和 List<uint>()
代替List<object>
将内存减少到约300 MB。
List<T>
is relevant? Doesn't an array display the same behavior? What problem are you trying to solve?"这段话的意思是:3700万个对象占用了2GB的内存,每个对象平均包含54字节的空间,其中包括运行时(GC)的记账和.NET框架的开销。而你所说的程序,即使什么也不做,其占用空间也已经达到了100MB。那么您认为使用List<T>
有什么关联?难道数组不会表现出同样的行为吗?您试图解决什么问题呢? - CodeCasternew object[37000000];
代替List<object>
- 注释掉后仍然是2 GB,取消注释后变成了420 MB。 - renList<byte>
和AddRange
。(不要忘记使用一些实际大小来初始化列表)。 - Stefan Steinegger