2012-01-09 84 views
3

有人告诉我,只有当一个引用被设置为null时,垃圾收集器才会收集它。不过,我认为垃圾收集器将收集所有超出范围的引用,它们从来没有被设置为null。什么时候对象引用会被垃圾回收?

任何人都可以告诉我什么时候垃圾收集器会引用一个引用?

+4

“某人”是错误的。 – SLaks 2012-01-09 15:07:46

回答

9

GC收集对象,未引用。

GC在没有更多实时引用后会收集对象一段时间。 (GC处于不确定性)

+1

+1:没有强引用的对象可以被GCed。 – 2012-01-09 15:09:42

+0

如果将引用设置为null,是否有助于触发gc? – user705414 2012-01-09 15:10:47

+0

@ user705414:不(这就是为什么它说它是非确定性的)。 – Groo 2012-01-09 15:19:46

2

什么是有人大概的意思是,你可以让GC收集的对象时,它超出范围通过设置拥有引用该对象null变量之前。对于一些非常罕见的情况(例如,在没有引用对象的长时间运行的循环之前),这种技术在过去是有价值的。现在的编译器技术使得这个想法实际上没有用处,因为编译器足够聪明以检测这些情况并采取相应的行动。

0

GC将从内存中删除一个对象“当它需要”。你可以尝试运行System.gc(),但它只是提示GC应该运行。 GC运行时,它会查找未引用的对象(或仅具有弱引用等的对象)。 GC在内存空间上运行频率降低。它经常在伊甸园空间运行。默认情况下,GC在eden空间中运行时会运行,但您可以调整JVM。

为什么你首先在烦扰GC?你怎么了?