我作一个服务程序要反复用到ArrayList,每次使用的时候调用Clear()方法,但所占用的内存并没有被放,请教怎么才能高效的释放内存?程序结构如下
Work()
{
    ArrayList al = new ArrayList()
    while()
    {
       al.Clear ();  //每次调用前清理一下
       //以下是业务处理语句,需要向al中填加大量的数据
    }
}
令我头痛的是该服务程序占用内存疯长,怎样才能有效控制?

解决方案 »

  1.   

    为什么要定义在外面?Work()
    {
            while()
        {
           ArrayList al = new ArrayList()
           al.Clear ();  //每次调用前清理一下
           //以下是业务处理语句,需要向al中填加大量的数据
        }
    }
    这样就不会疯长了吧
      

  2.   

    每次都要new一个,长的更厉害
      

  3.   

    内存是由gc回收的,并不是你不使用了就释放
    可以用GC.Collect()手工回收
      

  4.   

    没有,就算用GC.Collect()也不是马上就能释放的,GC.Collect()只是通知GC回收,但不代表马上
      

  5.   

    可考虑使用Hashtable,效果会好一点的
      

  6.   

    问题估计不是出在ArrayList的Clear上,你能肯定ArrayList中保存的对象,没有在其他地方还活着?如果是的话,那么即使你Clear了,也只能表示你的对象从ArrayList中解除了一个引用而已。检查你的代码,另外你可以做一个试验,那就是在Clear之前,把ArrayList中的全部对象设置为null,然后Clear之后,调用GC.Collect()。看看你的程序的其他部分是否正常,同时你也可以检查内存的使用情况。
      

  7.   

    楼上正解
    比如有两个arraylist都引用了同一个对象.你clear其中的一个.这个对象还存在于另一个arraylist中.
      

  8.   

    ArrayList.TrimToSize 方法  [C#]请参见
    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 的容量设置为默认容量,而不是零。
      

  9.   

    Clear只是逻辑上将表清空,但表中的对象是否被销毁还要看是否被引用以及GC,主要占内存的是ArrayList包含的对象,而不是ArrayList本身。
      

  10.   

    GC.Collect强制进行垃圾回收,如果没有回收说明你的对象在其他地方还有引用.
      

  11.   

    Work()
    {
        ArrayList al = new ArrayList()
        while()
        {
           al=null;
           al.Clear ();  //每次调用前清理一下
           GC.Collect;
           //以下是业务处理语句,需要向al中填加大量的数据
        }
    }
      

  12.   

    al.Clear();并不减少Arraylist占用的容量
    执行完clear()最好trimSize()
      

  13.   

    ArrayList.Clear 方法  [C#]请参见
    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
      

  14.   

    要解决这个问题,首先了解两点:原理:net是怎么分配ArrayList的Capacity值,即容量的?
     答:.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的原理。