日期:2014-05-20  浏览次数:20718 次

关于java内存泄露的一点小问题
比如,下面的代码,据说循环的去创建对象,会造成内存泄露是么,那么如何做才可以避免呢。

vector v=new vector();
for(int i=0;i<5;i++)
{
Object o=new Object();
v.add(o);
o=null;
}

------解决方案--------------------
不会吧
Java内存泄漏指的是长期不释放无用对象的引用
------解决方案--------------------
引用:
比如,下面的代码,据说循环的去创建对象,会造成内存泄露是么,那么如何做才可以避免呢。

vector v=new vector();
for(int i=0;i<5;i++)
{
Object o=new Object();
v.add(o);
o=null;
}


这部分代码的作用是什么呢?所谓的泄露应该就是new Object()这个对象在出了语句块之后,就没有东西指向了,这些对象属于JVM会回收的那部分资源,应该不属于泄露,个人见解!
------解决方案--------------------
你这种循环创建对象的情况并不会造成内存泄漏。
但是如果你把这个对象无休止的放入一个全局的对象中,就可能会造成内存溢出(说内存泄漏不太准确)。
比如你这里如果Vector v;是一个全局变量,在它的整个生命期内,你一直new对象往里面放的话,就可能会溢出。
------解决方案--------------------
    你说的内存泄漏应该是,不用了的对象,希望GC回收掉,但是一些操作使得其它(更长生命周期)的引用又指向了该对象,导致GC无法回收。

    既然循环中new的Object对象已经用不到了,为什么要放在Vector里呢?

    避免的方法可以简单的理解为:以后用不到的对象,就不要用长生命周期的引用去关联它,让它被GC回收掉就好了。
    
    如程序中,所示,既然对象o已经没用了,就别往Vector里放了。
------解决方案--------------------
引用:
比如,下面的代码,据说循环的去创建对象,会造成内存泄露是么,那么如何做才可以避免呢。

vector v=new vector();
for(int i=0;i<5;i++)
{
Object o=new Object();
v.add(o);
o=null;
}


不知道你听谁说的,但是可以肯定的是,你被骗了。
------解决方案--------------------
这个代码是会产生内存溢出的。因为虽然o=null,但是vector没有释放每个o,所以gc不能回收每个o,最终产生溢出。
我写代码使了一下。
Vector<a> aa=new Vector<a>();
for(int i=0;i<10000000;i++)
{
a x=new a();
aa.add(x);
x=null;
if(aa.size()==1000)//
aa.clear();//
}
可以运行,没有问题。
但是如果将最后两行注释掉,就会报错Exception in thread "main" java.lang.OutOfMemoryError: Java heap space。楼主可以自己试一下