2013-05-08 29 views
-1

我一个无法跟踪这些垃圾收集器是invoked.plz帮助垃圾收集器被调用的机会最多的地方在哪里?

class Garbage01 
{ 
public static void main(String args[]) 
{ 
    Garbage01 h = new Garbage01(); 
    h.methodA(); /* Line 6 */ 
} 
Object methodA() 
{ 
    Object obj1 = new Object(); 
    Object [] obj2 = new Object[1]; 
    obj2[0] = obj1; 
    obj1 = null; 
    return obj2[0]; 
} 
} 
+3

跟踪垃圾收集器被调用的位置是不可能的。 – johnchen902 2013-05-08 12:11:54

+6

垃圾收集器将在运行时运行。有些保证会在某些情况下运行(在抛出OutOfMemoryError之前),但除此之外,您无法知道它何时运行,并且无法强制它运行。 – 2013-05-08 12:12:46

+0

*垃圾收集器被调用的可能性最大的地方是什么?*:完成main()'!!!! – NINCOMPOOP 2013-05-08 12:13:36

回答

2

java中的垃圾收集被自动调用,它收集有资格进行垃圾收集的对象。

如果垃圾收集或GC无法从任何活动线程或任何静态参考中获得,换句话说,如果对象如果其所有引用都为空,则可以说对象有资格进行垃圾回收。

循环依赖,不作为参考,因此,如果对象A具有对象B的参考和对象B对象A的参考和他们没有任何其他活动引用那么这两个Objects AB将有资格获得Garbage collection

因此,不可能检查垃圾收集器何时被调用/调用。

0

垃圾收集器在了methodA()永远不会调用

因为垃圾收集发生在方法返回其参照对象后。该方法返回到第6行,没有引用来存储返回值。所以垃圾收集发生在第6行之后。

+0

你可能会说它什么时候不会发生,但你当然不能确定地说它将会发生。 – NilsH 2013-05-08 12:16:18

+0

垃圾收集器不会在这里被调用,因为对象的引用正在维护并返回obj2 [0] – 2013-05-08 12:31:12

+1

可以说引用不会被垃圾回收,但我的观点是,你不能说完全_when_垃圾收集器将运行。 – NilsH 2013-05-08 12:35:21