C# List内存分配

转载 2016年05月31日 23:35:27

转载自:http://www.cnblogs.com/visionwang/archive/2013/04/24/3041379.html

有些时候由于代码的问题(确切地说是不了解framework的内存使用机制)也会导致outofmemory,一般占用大内存的情况就是list和hashtable2种结构,而这2种数据结构实际上都是使用数组作为容器存放元素的,由于数组是定长结构所以当达到上限时需要做动态扩容,动态扩容的算法都是2倍当前数组长度,数组本身又是需要连续内存作为保证,如果内存碎片过多就会导致没有连续内存可用,.net的智能垃圾回收器也没办法完全避免内存碎片(可以通过禁止垃圾回收或者降低垃圾回收频率来避免碎片,但是需要手工回收来解决内存增长问题),所以在使用list或者hashtable的时候最好能事先指定需要的最大容量上限,避免到后面因为碎片问题导致outofmemory。比如申请的初始内存块不够大,后期要分配更大内存,在本块内存区后面没有这么大的连续空闲内存,就会outofmemory。

小计:C# List的内存分配

当List<T>对象的Item元素数量超过了Capacity的数量时,List<T>对象会重新申请一块大小是原来Capacity的两倍的内存空间,然后将当前所有Item元素以及待添加元素复制到新的内存空间中。

知道了内存分配的原则,接下来就得根据这些原则来采用最优的方法保证有限的内存空间能得到合理的运用。归纳起来主要有如下你点:
1.当实例化一个List<T>对象时,如果能预知其Item元素的大致个数,应该在实例化一个List<T>对象的时候设置其Capacity值为接近于Item元素个数的最小值。这样的话可以避免在像List<T>中添加元素的时候,不断的申请内存与元素的复制。

2.当由于不断的调用Remove方法而导致Item元素的个数远远小于Capacity,就会造成内存的浪费。此时可以调用TrimExcess方法释放多余的内存。

C#中数组、ArrayList和List三者的区别

在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢。 数组     数组在C#中最早出现的。在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2013年03月11日 00:03
  • 182923

探索C# : List 元素类型和清除方法

List 值引用
  • helloapplepear
  • helloapplepear
  • 2016年03月16日 22:33
  • 845

C#内存泄露与资源释放 经验总结

经验总结:C#并不是有了垃圾回收机制,你就可以对内存管理放任不管,其实在稍不注意的时候,可能就造成了内存泄露,或者超大内存占用~ 以下记录下遇到过的内存优化-内存泄露的问题与应对方案。 1...
  • Yokeqi
  • Yokeqi
  • 2014年11月13日 18:39
  • 10474

C#中list<T>性能内存优化分配,Capacity设置

当List对象的Item元素数量超过了Capacity的数量时,List对象会重新申请一块大小是原来Capacity的两倍的内存空间,然后将当前所有Item元素以及待添加元素复制到新的内存空间中。 ...
  • AAA123524457
  • AAA123524457
  • 2016年03月04日 17:46
  • 2067

C# List的内存分配

C# List的内存分配 当List对象的Item元素数量超过了Capacity的数量时,List对象会重新申请一块大小是原来Capacity的两倍的内存空间,然后将当前所有Item元素以及待添...
  • qyxls
  • qyxls
  • 2015年04月01日 22:39
  • 1207

C# list存储的数据格式以及默认初始化空间,内存回收分析

上面的代码是从System.Collections.Generic下扒出来的,我们看第一个图片中的代码 private const int _defaultCapacity = 4;这里我们可以看到,...
  • u014180504
  • u014180504
  • 2016年04月19日 18:43
  • 1874

C# list存储的数据格式以及默认初始化空间,内存回收分析

上面的代码是从System.Collections.Generic下扒出来的,我们看第一个图片中的代码 private const int _defaultCapacity = 4;这里我们可以看到,...
  • kong1940742529
  • kong1940742529
  • 2016年11月12日 15:54
  • 426

paip.提升性能---C#.NET程序内存占用过多以及OutOfMemory解决方法

paip.提升性能---C#.NET程序内存占用过多以及OutOfMemory解决方法 作者Attilax ,  EMAIL:1466519819@qq.com  需要的效...
  • attilax
  • attilax
  • 2013年04月22日 22:21
  • 5146

c++ STL容器的内存分配

一.前言在使用STL各类容器的时候,有时会出现迭代器失效,引用(指针)失效等情况的而发生,即使看似你的操作都是合法的情况下。要了解问题的原因,我们就要了解C++中stl容器的内存分配策略。我们才知道在...
  • y1196645376
  • y1196645376
  • 2016年10月27日 23:59
  • 1615

STL中的list/set/map等容器clear之后的内存占用

最近在知乎上看到一个问题
  • hekailing
  • hekailing
  • 2014年11月09日 20:05
  • 3545
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# List内存分配
举报原因:
原因补充:

(最多只允许输入30个字)