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#中list<T>性能内存优化分配,Capacity设置

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

C# List的内存分配

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

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

上面的代码是从System.Collections.Generic下扒出来的,我们看第一个图片中的代码 private const int _defaultCapacity = 4;这里我们可以看到,...

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

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

C#中的内存分配

稍微有过C#基础的程序员都知道,值类型和引用类型在内存中的分配方式是不一样的。下面我们就来谈谈他们的具体分配过程。 1. 对值类型的分配。 虚拟内存中存在一个叫堆栈的区域,我们并不知道它到...
  • qyxls
  • qyxls
  • 2015年04月01日 22:49
  • 1411

C# WPF 快速开发12批量数据插入数据库

  • wowkk
  • wowkk
  • 2013年06月09日 20:22
  • 2556

ListBox性能问题

网上有大量的讨论ListBox性能问题的文章: 国外有一个加作Peter Torr的人写了一个LazyListBox来改进滚动性能,主要是针对海量ListItem的情况。 原文地址如下:  htt...

List容器内存分配原则

 当采用默认构造函数List value = new List();实例化一个List对象时,.Net Framework只是在内存中申请了一块内存来存放List对象本身(不包含List当中的I...
  • daone
  • daone
  • 2014年01月13日 13:36
  • 541

【转】原来是这样:C#中字符串的内存分配与驻留池

作者:cyoooo7 2011-05-24 23:23 出处:博客园 刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两...
  • huge92
  • huge92
  • 2013年03月30日 22:36
  • 437
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# List内存分配
举报原因:
原因补充:

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