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对象成为可被回收状态.
{
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对象成为可被回收状态.
相关文章推荐
- 二.Java的初始化机制、垃圾回收机制和内存分配机制
- Java垃圾回收机制(GC)
- 根据Java垃圾回收机制探讨内存优化
- java垃圾回收机制--CMS
- Java 垃圾回收机制
- java 垃圾回收机制浅析
- JVM详解之Java垃圾回收机制详解和调优
- (转)Java 内存区域分配和垃圾回收(GC)机制
- Java的垃圾回收机制
- Notes: Garbage Collection in Java(Java的自动垃圾回收机制)
- Websphere 6.0 设置垃圾回收机制 出现 java launcher 已停止工作 产生 错误代码:40000015
- JAVA垃圾回收机制
- 浅析Java内存区及其垃圾回收机制
- JAVA垃圾回收机制
- Java中的垃圾回收机制
- java 垃圾回收机制
- 成为Java GC专家(1):深入浅出Java垃圾回收机制
- Java的垃圾回收机制详解和调优
- 全面分析Java的垃圾回收机制
- 细述 Java垃圾回收机制→How Java Garbage Collection Works?