Java 不调用新对象();两次使第一次调用创建的对象有资格进行垃圾收集?
鉴于: 调用Java 不调用新对象();两次使第一次调用创建的对象有资格进行垃圾收集?,java,garbage-collection,Java,Garbage Collection,鉴于: 调用doSomething()方法时,第5行中创建的对象在哪一行之后可用于垃圾收集 正确答案是第8行 为什么呢?我认为应该是第7行,因为new将启动一个新的对象,然后分配给o,这导致在第5行中创建的对象失去其引用(然后符合GC)。我错了吗 正确答案是第8行。为什么呢 您将o本地到doSomething()与类级别的o混淆。即使第7行将doSomething()版本的o设置为其他引用,您仍然拥有通过doSomethingElse()方法设置的类级别o。您必须将该引用设为null,以使其符合
doSomething()
方法时,第5行中创建的对象在哪一行之后可用于垃圾收集
正确答案是第8行
为什么呢?我认为应该是第7行,因为new将启动一个新的对象
,然后分配给o
,这导致在第5行中创建的对象
失去其引用(然后符合GC)。我错了吗
正确答案是第8行。为什么呢
您将o
本地到doSomething()
与类级别的o
混淆。即使第7行将doSomething()版本的o
设置为其他引用,您仍然拥有通过doSomethingElse()
方法设置的类级别o
。您必须将该引用设为null,以使其符合GC条件,而这只能通过第8行的方法调用实现。Yes!非常感谢你!我现在明白了。我没有注意到隐藏实例变量的局部对象o,这个问题是为了混淆这个方式而设计的,我认为=.=酷,我很高兴这有帮助!
1. public class GC {
2. private Object o;
3. private void doSomethingElse(Object obj) { o = obj; }
4. public void doSomething() {
5. Object o = new Object();
6. doSomethingElse(o);
7. o = new Object();
8. doSomethingElse(null);
9. o = null;
10. }
11. }