一个外企面试题,题目大致意思是:
void fun() {
    String s = new String("abc");
    String[] a = new String[1];
    a[0] = s;
    s = null;
}
问"abc"这块内存啥时候释放?
答案是内存泄露了。
难道是因为s在栈内存,而a在堆内存的缘故吗? 

解决方案 »

  1.   

    在执行完这个代码块时释放,
    即执行到最后一个大括号“{”时释放,
    记得在考SCJP时见到过这种题。
      

  2.   

    没有泄露。a[0]还在引用着这个String对象,这不叫泄露。
      

  3.   

    public class MeL {
    public static void main(String[] args){
    Test m=new Test();
    Test[] a=new Test[1];
    a[0]=m;
    m=null;
    System.gc();
    }
    }class Test{
    public static long  counter=0;
    @Override
    protected void finalize() throws Throwable {
    System.out.println("被回收"+(++counter)+"次");
    }
    }测试结果:没有被回收, 说明没有“泄露”
      

  4.   

    方法结束后垃圾回收自己回收了。。不是c/c++,java自己有回收机制
      

  5.   

    其实大家回答的都没有错 但是我想这个问题的提问点在于fun方法执行的时候,也就是方法体内,String s = new String("abc"); 这条语句执行时创建的abc对象什么时候销毁了  其实fun方法内并没有显式地销毁这个abc对象 因此是泄露了
      

  6.   

    这也叫内存泄漏啊?那JAVA得垃圾回收机制是什么时候派上用场的?
      

  7.   

    Java的内存泄漏指的是有引用的无用对象。比如说Object[] objs=new Object[2];
    objs[0]=new Object();
    objs[1]=new Object();
    objs[0]=null;objs[0]的空间会一直存在与代码生存期,直至退出。所以称之为Java内存泄露。拙见
      

  8.   

    "难道是因为s在栈内存,而a在堆内存的缘故吗?"   s怎么会在栈内存呢,s明明在堆内存中的静态存储区。
    在java里代码本身是无法管理内存的,我们只能通知垃圾回收器进行回收,比如 设置s=null就是告诉垃圾回收器s指向的这块内存可以回收了,至于回收器什么时候回收,那要看具体的垃圾回收算法了,各个不同的虚拟机实现都不一样
      

  9.   

    昨天刚在网上看了一篇关于内存泄露的文章, 文章中提出:
    java的垃圾回收机制采用的是有向图的形式来进行判断, 图中无法到达的点(即不会再被引用的变量)将会被回收.
    但是java编码时存在这样一种情况: 在有向图中有边连接到某个点, 但是在程序中将不会再引用.
    如下面的代码:Vector v=new Vector(10);
    for (int i=1;i<100; i++)
    {
    Object o=new Object();
    v.add(o);
    o=null;
    }
    //此时,所有的Object对象都没有被释放,因为变量v引用这些对象。
    上面的例子和你题目中的是一个意思, 即虽然释放了对'o', 但是v仍然引用着object. 帮GC是不会回收的. 解决办法就是把v置成null.
    具体见http://hi.baidu.com/chenminliang/blog/item/fc627160d17d0ade8cb10d4e.html
      

  10.   

    这个东西比较复杂,回去再看看think in java~~
      

  11.   


    不是的。这是空对象,或者说有引用但是不指向任何实体的对象,它并不是内存的泄漏,它其实是Java虚拟机上的一个地址型数据而已,仅仅占据很少的空间。
      

  12.   

    内存泄漏的原意是有实体却没有名字,从而无法被程序使用,但是又一直存在的对象。这个问题在C++里比较严重,所以在C++的动态内存申请里,必须注意释放动态申请的内存。但是Java里,垃圾收集器会不定时自动清理不再使用的对象,所以,实际上几乎不会发生内存泄漏的情况。