看到很多资料讲到java内存泄露经常举到的例子:
Vector v=new Vector(10);for (int I=1;I<100; I++){Object o=new Object();v.add(o);o=null;}在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。(问题一:这个例子只说明了问题 没有说明解决方法
假如我的类如下:
public class Test {
public Vector getVector(){
Vector v=new Vector(10); for (int I=1;I<100; I++) { Object o=new Object(); v.add(o); o=null; }
return v;
} public static void main(String[] args) {
// TODO Auto-generated method stub
     Vector v=new Test().getVector();  
}
}问题二:问下大家存不存在内存泄漏,为什么?

解决方案 »

  1.   

    1.解决方法是在把o置为null之前从vector中移除o
    2.没有漏洞,只是控制台执行
    完了全给回收了
    1中的泄漏的一个可能性前提是:
    vector是一个全局的,从系统开始运行就一直存在的static vector
      

  2.   

    实质上,这个就是《Effective Java》中说的:消除过期的对象引用的问题
    1.解决方法是在对象使用完毕后立即消除所有对它的引用
    2.如1楼说的,不存在因为getVector()方法中对Vector的引用是局部的,方法返回后即被释放,不再引用该Vector楼主可以看下那本书
      

  3.   

    内存泄漏最容易出现的地方是IO流,InputStream和outputStream,如果没有close,每次打开或者写文件都会打开流实例,总有一天会把内存吃光
      

  4.   

    回答问题二:
    当然会有内存泄露的情况,当程序所需内在超过jvm的最大内存时,就会报内存泄露的错误,比如:
    tomcat启动时、程序死循环时等都有可能出现此现象。