一个外企面试题,题目大致意思是:
void fun() {
String s = new String("abc");
String[] a = new String[1];
a[0] = s;
s = null;
}
问"abc"这块内存啥时候释放?
答案是内存泄露了。
难道是因为s在栈内存,而a在堆内存的缘故吗?
void fun() {
String s = new String("abc");
String[] a = new String[1];
a[0] = s;
s = null;
}
问"abc"这块内存啥时候释放?
答案是内存泄露了。
难道是因为s在栈内存,而a在堆内存的缘故吗?
即执行到最后一个大括号“{”时释放,
记得在考SCJP时见到过这种题。
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)+"次");
}
}测试结果:没有被回收, 说明没有“泄露”
objs[0]=new Object();
objs[1]=new Object();
objs[0]=null;objs[0]的空间会一直存在与代码生存期,直至退出。所以称之为Java内存泄露。拙见
在java里代码本身是无法管理内存的,我们只能通知垃圾回收器进行回收,比如 设置s=null就是告诉垃圾回收器s指向的这块内存可以回收了,至于回收器什么时候回收,那要看具体的垃圾回收算法了,各个不同的虚拟机实现都不一样
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
不是的。这是空对象,或者说有引用但是不指向任何实体的对象,它并不是内存的泄漏,它其实是Java虚拟机上的一个地址型数据而已,仅仅占据很少的空间。