我作一个服务程序要反复用到ArrayList,每次使用的时候调用Clear()方法,但所占用的内存并没有被放,请教怎么才能高效的释放内存?程序结构如下
Work()
{
ArrayList al = new ArrayList()
while()
{
al.Clear (); //每次调用前清理一下
//以下是业务处理语句,需要向al中填加大量的数据
}
}
令我头痛的是该服务程序占用内存疯长,怎样才能有效控制?
Work()
{
ArrayList al = new ArrayList()
while()
{
al.Clear (); //每次调用前清理一下
//以下是业务处理语句,需要向al中填加大量的数据
}
}
令我头痛的是该服务程序占用内存疯长,怎样才能有效控制?
{
while()
{
ArrayList al = new ArrayList()
al.Clear (); //每次调用前清理一下
//以下是业务处理语句,需要向al中填加大量的数据
}
}
这样就不会疯长了吧
可以用GC.Collect()手工回收
比如有两个arraylist都引用了同一个对象.你clear其中的一个.这个对象还存在于另一个arraylist中.
ArrayList 类 | ArrayList 成员 | System.Collections 命名空间 | Clear | Capacity | Count | ArrayList 成员(Visual J# 语法) | C++ 托管扩展编程 要求
平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列, .NET Framework 精简版 - Windows CE .NET, 公共语言基础结构 (CLI) 标准语言
C#C++JScriptVisual Basic全部显示
将容量设置为 ArrayList 中元素的实际数量。
[Visual Basic]
Public Overridable Sub TrimToSize()
[C#]
public virtual void TrimToSize();
[C++]
public: virtual void TrimToSize();
[JScript]
public function TrimToSize();
异常
异常类型条件
NotSupportedExceptionArrayList 为只读。
- 或 -
ArrayList 具有固定大小。备注
如果不向列表中添加新元素,则此方法可用于最小化列表的内存系统开销。
若要完全清除列表中的所有元素,请在调用 TrimToSize 之前调用 Clear 方法。截去空 ArrayList 会将 ArrayList 的容量设置为默认容量,而不是零。
{
ArrayList al = new ArrayList()
while()
{
al=null;
al.Clear (); //每次调用前清理一下
GC.Collect;
//以下是业务处理语句,需要向al中填加大量的数据
}
}
执行完clear()最好trimSize()
ArrayList 类 | ArrayList 成员 | System.Collections 命名空间 | TrimToSize | Capacity | Count | ArrayList 成员(Visual J# 语法) | C++ 托管扩展编程
要求
平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列, .NET Framework 精简版 - Windows CE .NET, 公共语言基础结构 (CLI) 标准
语言
C#C++JScriptVisual Basic全部显示
从 ArrayList 中移除所有元素。[Visual Basic]
Public Overridable Sub Clear() Implements IList.Clear[C#]
public virtual void Clear();[C++]
public: virtual void Clear();[JScript]
public function Clear();实现
IList.Clear异常
异常类型 条件
NotSupportedException ArrayList 为只读。
- 或 -ArrayList 具有固定大小。
备注
Count 设置为零。Capacity 保持不变。若要重置 ArrayList 的容量,请调用 TrimToSize 或直接设置 Capacity 属性。截去空 ArrayList 会将 ArrayList 的容量设置为默认容量,而不是零。===
摘自msdn
答:.net默认按倍值自动分配Capacity值的,比如说,默认Capacity是16,当你填充了超过16元素的的时候,ArrayList的Capacity值自动按上次的一倍增加,也是32,当你填充元素超过32,那自然Capacity也就是64拉,依次类推,如果你的元素很多,Capacity的值就会很大,而Capacity的大小是代表内存分配的大小解决方案:
1,在程序中根据你要处理的元素树,自己设定ArrayList的Capacity,不要使用.net的自动设置
2, 每次处理完后也要Clear一下,然后用al = null ;清空ArrayList
3,可以根据情况调用GC.Collect(),不过掉用次数过多,反而跟占用资源。一般情况下,不建议直接用GC.Collect()清理内存。具体你最好多了解以下GC的原理。