请教一个关于内存泄露的问题..........

pro4j 2004-12-20 07:50:14
先请看一个简单的例子:
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;
}
这里是不是存在内存泄露?list一直保持着对map的引用,所以即使后面加上map = null也不能回收map?
如果我在另一个类的方法里面这样调用这个list:
...
List list2 = new ArrayList();
request.setAttribute("list2",list2);
list2 = null;
..
..
是不是就可以避免内存泄露?

请高手指点一下这里面关于对象的引用和对象回收的问题,谢谢!
...全文
169 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
不徻写代码 2005-01-13
  • 打赏
  • 举报
回复
学习
bboonnee 2005-01-13
  • 打赏
  • 举报
回复
关注
treeroot 2005-01-13
  • 打赏
  • 举报
回复
http://blog.csdn.net/treeroot/archive/2005/01/12/250703.aspx
dabo1980 2005-01-13
  • 打赏
  • 举报
回复
看不出会有内存泄漏的问题,内存泄漏没那么容易发生的。
bonniewater 2005-01-13
  • 打赏
  • 举报
回复
在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。


关键还是这个概念的理解吧
bonniewater 2005-01-13
  • 打赏
  • 举报
回复
好象都有道理
eureka0891 2005-01-13
  • 打赏
  • 举报
回复
那下面这个例子有没有泄露呢?http://www-900.ibm.com/developerWorks/cn/java/l-JavaMemoryLeak/index.shtml
不是同样的问题吗?在这个例子中,我们循环申请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引用这些对象。

请指教,谢谢
==============================================================
o=null;没必要,因为马上就过了它的生存周期

==============================================================
楼上,我觉得你说的“最简单的方法就是将Vector对象设置为null。”不是一个好的办法,最近我也一只在研究内存的问题,并且用JProbe Suite工具来测试过,如果像你这样只是把Vector设置为null,因为java的回收机制对 new Object产生的对象回收的不是很即使,一旦用户访问量一上来,就出现内存暴涨的问题,如果恶意刷新页面,好像容易game over。所以最好是这样
for(int i=0;i<vector.size(); i++) {
vector.get(i) = null;
}
vector.clear();
vector = null;

由于研究的不是很透,没有很经典的论据,只是在测试工具上看出来,这么做内存能够很及时的回收。
==============================================================

对这个如果vector里的东西是你vector.get(i)后就不用了,可以这样写(释放内存应该快一点点,如果你的vector在你的for刚完不久就不再有引用的话,写不写就没必要了)



个人认为做java没必要考虑内存泄漏,
基本上不会发生,只用考虑对传很大对象引用的生存周期就行了,
强制让其为null是没必要的,只要其超出了生存周期就找不到引用,虚拟机会回收的.
badboy_119 2005-01-12
  • 打赏
  • 举报
回复
关注!
wwwtom 2004-12-21
  • 打赏
  • 举报
回复
java里怎么能有内存泄露呢,不明白,java平台都做好的啊,
好象只能是越界吧,
treeroot 2004-12-21
  • 打赏
  • 举报
回复
内存泄露的典型例子:

class Stack{
Object[] objs=new Object[100];
private int index=-1;
public Object pop(){
return objs[index--];
}
public void push(Object o){
ojbs[++i]=o;
}
}
treeroot 2004-12-21
  • 打赏
  • 举报
回复
晕,这个怎么会内存泄露呢?你太过敏了吧
kaymo 2004-12-21
  • 打赏
  • 举报
回复
应该不会泄漏
gogc 2004-12-21
  • 打赏
  • 举报
回复
java的回收机制是能够自动回收内存,但是往往不太理想,需要我们尽量自己来释放内存!
另外System.gc();的使用在试验中多少也有点加速内存的回收,但效果不大。
gogc 2004-12-21
  • 打赏
  • 举报
回复
楼上,我觉得你说的“最简单的方法就是将Vector对象设置为null。”不是一个好的办法,最近我也一只在研究内存的问题,并且用JProbe Suite工具来测试过,如果像你这样只是把Vector设置为null,因为java的回收机制对 new Object产生的对象回收的不是很即使,一旦用户访问量一上来,就出现内存暴涨的问题,如果恶意刷新页面,好像容易game over。所以最好是这样
for(int i=0;i<vector.size(); i++) {
vector.get(i) = null;
}
vector.clear();
vector = null;

由于研究的不是很透,没有很经典的论据,只是在测试工具上看出来,这么做内存能够很及时的回收。

pro4j 2004-12-20
  • 打赏
  • 举报
回复
那下面这个例子有没有泄露呢?http://www-900.ibm.com/developerWorks/cn/java/l-JavaMemoryLeak/index.shtml
不是同样的问题吗?在这个例子中,我们循环申请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引用这些对象。

请指教,谢谢
zyg158 2004-12-20
  • 打赏
  • 举报
回复
应该没有泄漏
pro4j 2004-12-20
  • 打赏
  • 举报
回复
不好意思写错了是Test(){...}

23,407

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧