ren*_*ren 8 c# memory-management
我有这样的事情:
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;
Run Code Online (Sandbox Code Playgroud)
现在val总是byte [4]并且有大约37000000个元素.所以我认为res应该是37*10 ^ 6*4字节= 148 MB,但实际内存使用量约为2GB.如果我评论,res.Add(val);那么内存使用量是100 MB.
那么记忆在哪里?
编辑
EDIT2
好吧,使用uint而不是byte [4] , List<uint>()而不是List<object>将内存大约300 MB.
这是分配大量微小对象的常见问题:通常可以忽略的对象开销发挥作用.
37*10 ^ 6*4字节= 148 Mb
假设四个字节的数组占用内存中的四个字节是不正确的.除了四个字节的有效负载之外,数组对象还必须存储数组的长度,同步块和类型指针.这适用于32位系统上的12字节开销,或64位系统上的24字节.
除了数组对象的单独开销之外,还需要考虑内存分配器的开销,内存对齐的开销以及垃圾收集器的开销.综合所有事情,看到使用的总内存增长到2 Gb并不是不合理的.
解决此问题的一种方法是切换到uints 列表,每个列表占用四个字节.当您需要存储四个字节时,将它们转换为uint,并将其存储在列表中.当您需要返回字节时,请转换uint为临时的四字节数组.使用BitConverter应付之间的转换uintS和阵列byte秒.
| 归档时间: |
|
| 查看次数: |
1518 次 |
| 最近记录: |