list和map怎么能回收,回收了写这个函数还有什么用,
这些对象在函数返回后有用。

解决方案 »

  1.   

    实际上楼主的两个例子都不存在内存泄露呀?
    第一个例子如果Test()执行,它的所有资源都会被垃圾回收器回收,再它返回的数据会在调用它的方法或类中,执行完被垃圾回收器回收。
    第二个例子就是对象句柄的引用,没有什么泄露不泄露的问题呀我说的不一定对,如果不对请大家指正
      

  2.   

    可是, 我在IMB社区上看到一个这样的例子,以下是引用原文:
    下面给出了一个简单的内存泄露的例子。在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。Vector v=new Vector(10);
    for (int i=1;i<100; i++)
    {
    Object o=new Object();
    v.add(o);
    o=null;
    }
    //此时,所有的Object对象都没有被释放,因为变量v引用这些对象。
    原文请参看这里http://www-900.ibm.com/developerWorks/cn/java/l-JavaMemoryLeak/index.shtml请大家指教,谢谢
      

  3.   

    to:haozhangpk(步惊云) 
    我也是这样想的,可是,看了这篇文章以后觉得很困惑,请多多指点
      

  4.   

    List list2 = new ArrayList();
    request.setAttribute("list2",list2);
    list2 = null;
    上面的代码中list2还被request引用,存在内存泄漏的可能。
      

  5.   

    其实JAVA是靠拷贝方式来进行对象传递的,也就不同于c++的引用方式,也就是上面所说的v.add(o),这个o,其实o在赋给add(Object object)这个函数时相当于做的是 Object b = new Object ; b=o;所这样在循环结束后生成的Object会被回收,但是Vector本身的却存储了大量的Object数据,如果Vector的生存期结束以后,自然Vector也就会被回收,这个时候就不会产生内存泄露,但是如果Vector没有被回收就会产生内存泄露!
      

  6.   

    to  pro4j(拿咖啡泡茶茶喝) 
    在effective java里面有个关于内存泄露的问题,例子为一个stack的一个pop方法:
    public Object pop(){
      if (size==0) throw new EmptyStackException();
      return elements[--size];
    }
    这里面的内存泄露是调用pop方法后,弹出了elements[i],但指向elements[i]的引用仍然在stack中,所以必须在pop出elements[i]后将stack中指向elements[i]的引用设置为null。
    修改后的方法为
    public Object pop(){
      if (size==0) throw new EmptyStackException();
      Object result=elements[--size];
      elements[size]=null;//eliminate obsolete reference
      return result;
    }
      

  7.   

    to  robber(海盗) louisbadbad(快乐就好)  larger102() 
    谢谢大家的热心指点,谢谢:)那么,可以肯定的是第一个例子确实存在内存泄露的问题
    我修改后的代码如下:
    public List Test(){
      List list = new ArrayList();
      for(i=0;i<100;i++)
          Map map = new HashMap();
          map.put("data1","data1");
          map.put("data2","data2");
          list.add(map);
          map = null;   //这一句是否没有意义?后面list=null以后map也应该会被回收,对不?
      }
      List newList = new ArrayList();
      newList = list;
      list = null;
      return newlist;
    }这样,list 对map的引用也就可以清除了,对吗?
      

  8.   

    我看你的理解有些问题,
    对于对象而言,不必太在令其=null,
    你的做法是new 了一个新的对象,和原来的是一样的,
    对java而言,超出其生存期的对象就会在适当的时候被回收.(太过于在乎=null,这种做法就和c++没区别了,那样是否要对每个对象用完后令其=null,除了float,int等基本类型不用外?)真正的内存泄漏很少, larger102() 的例子很好.
    这个实现的是个栈,第i个节点pop出去闻,当然要把存它reference的清掉.(其实也可以不清,如在最后不用这个栈的时候,超出了这个栈的生存空间也会清掉,但是这样可能会占用太长时间的内存)
      

  9.   

    public List Test(){
      List list = new ArrayList();
      for(i=0;i<100;i++)
          Map map = new HashMap();
          map.put("data1","data1");
          map.put("data2","data2");
          list.add(map);
      }
      return list;
    }lis是个局部变量,它生存在当前方法的栈中。当本方法结束后,栈空间释放,list就会失效。
    所以没有内存泄露,没有必要置为NULL。