List list2 = new ArrayList(); request.setAttribute("list2",list2); list2 = null; 上面的代码中list2还被request引用,存在内存泄漏的可能。
其实JAVA是靠拷贝方式来进行对象传递的,也就不同于c++的引用方式,也就是上面所说的v.add(o),这个o,其实o在赋给add(Object object)这个函数时相当于做的是 Object b = new Object ; b=o;所这样在循环结束后生成的Object会被回收,但是Vector本身的却存储了大量的Object数据,如果Vector的生存期结束以后,自然Vector也就会被回收,这个时候就不会产生内存泄露,但是如果Vector没有被回收就会产生内存泄露!
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; }
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的引用也就可以清除了,对吗?
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。
第一个例子如果Test()执行,它的所有资源都会被垃圾回收器回收,再它返回的数据会在调用它的方法或类中,执行完被垃圾回收器回收。
第二个例子就是对象句柄的引用,没有什么泄露不泄露的问题呀我说的不一定对,如果不对请大家指正
下面给出了一个简单的内存泄露的例子。在这个例子中,我们循环申请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请大家指教,谢谢
我也是这样想的,可是,看了这篇文章以后觉得很困惑,请多多指点
request.setAttribute("list2",list2);
list2 = null;
上面的代码中list2还被request引用,存在内存泄漏的可能。
在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;
}
谢谢大家的热心指点,谢谢:)那么,可以肯定的是第一个例子确实存在内存泄露的问题
我修改后的代码如下:
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的引用也就可以清除了,对吗?
对于对象而言,不必太在令其=null,
你的做法是new 了一个新的对象,和原来的是一样的,
对java而言,超出其生存期的对象就会在适当的时候被回收.(太过于在乎=null,这种做法就和c++没区别了,那样是否要对每个对象用完后令其=null,除了float,int等基本类型不用外?)真正的内存泄漏很少, larger102() 的例子很好.
这个实现的是个栈,第i个节点pop出去闻,当然要把存它reference的清掉.(其实也可以不清,如在最后不用这个栈的时候,超出了这个栈的生存空间也会清掉,但是这样可能会占用太长时间的内存)
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。