您的位置:首页 > 编程语言 > Java开发

java的垃圾回收机制

2010-03-03 17:09 197 查看
class streejith
{
public static void main(String args[])
{
String s = "hello";
String s1 = "hello";
System.out.println(s1);
String s2 = s1;
s = null;
}
which line the garbage collector will invoke first?
A. 7
B. 8
C. 9
D. never invoke in this method

class Test{
private Demo d;
void start(){
d = new Demo();
this.takeDemo(d);
}
void takeDemo(Demo demo){
demo = null;
demo = new Demo();
}
}
when is the Demo object eligible for garbage collection?
A. After line 5
B. After line 9
C. After the start() method completes.
D. When the takeDemo() method completes.
E. When the instance running this codeis made eligible for garbage collection.

这两题答案分别是D, E

java的垃圾回收机制是由虚拟机自动调用的,并不是当程序运行结束后就调用的,虽说你已经把对象给设成null了,但是在内存中还存在,要想通过程序手动调用垃圾回收的话,可以运行 System.gc(); 这个方法是调用虚拟机的垃圾回收的函数。

第一题, String s = "hello", 而不是String s = new String("hello"), 因此前者所引用的对象似乎受一种叫Constant String Pool的东西的约束而可能并不直接由Garbage Collector来管理, 因此不invoke Garbage Collector. (或者对此题我的解答你可以理解为常量字符串不受Gargage Collector管理也可)(这是我个人的理解, 可能是错误的, 仅供参考)

第二题, 由于d是一个成员属性, 因此它的生命周期也就等同于对象的生命周期, 所以只有在所执行的代码(也就是对象)成为可被回收时成员d才一并被赋予相同的状态. 至于在takeDemo方法中, 所有的操作都是对参数这个引用进行的, 所以并不能影响到原来的对象. 想必你也发现了, new Demo()所创建的对象, 由于d在指向它因此它的引用计数此时为1, 在进入takeDemo方法后参数引用又指向了先前创建的对象, 因此此时对象的引用计数为2, 在takeDemo方法中将参数引用设置为null(此方法中重新new并不会对此题产生什么决定性的影响)只能将先前所创建的Demo对象的引用计数减1, 因此引用计数还剩1, 所以takeDemo方法并不能使先前new的那个Demo对象成为可被回收状态.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: