【发布时间】:2017-08-30 23:01:23
【问题描述】:
我有这样的事情:
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 始终是字节[4],大约有 37000000 个元素。所以我认为res 应该在 37*10^6 * 4 bytes = 148 MB 左右,但实际内存使用量在 2GB 左右。如果我评论res.Add(val);,那么内存使用量大约是 100 MB。
那么内存去哪了?
编辑
我尝试使用 uint 代替 byte[4],但结果是一样的:
EDIT2
好的,使用 uint 代替 byte[4] and List<uint>() 代替 List<object> 将内存设置为 300 MB 左右。
【问题讨论】:
-
如何计算内存使用量?任务管理器?
-
3700 万个对象的 2 GB 减少到每个装箱值 54 个字节,包括运行时 (GC) 的簿记和一般 .NET 的开销,而且您的程序并不小,因为当它完全没有做任何事情时,您指示的占用空间为 100 MB。为什么你认为
List<T>是相关的?数组不显示相同的行为吗?你想解决什么问题? -
@HimBromBeere 使用 VS 调试器,看截图
-
@CodeCaster 我只是尝试使用
new object[37000000];而不是List<object>- 未注释它仍然是 2 Gb,注释它是 420 Mb -
一些简单的尝试:
List<byte>和AddRange。 (不要忘记用一些实际大小来初始化列表)。
标签: c# memory-management