对象引用何时会被垃圾回收?

3

有人告诉我只有在将引用设置为null时,垃圾收集器才会收集它。但是我认为垃圾收集器将收集所有超出范围的引用,这些引用从未被设置为null。

请问有人能告诉我什么时候引用将被垃圾收集器回收吗?

3个回答

9

垃圾收集器只回收对象,而不是引用。

垃圾收集器会在一个对象没有任何活动引用后的某个时间点上将其收集。(垃圾收集器是非确定性的)


如果将引用设置为null,是否有助于触发垃圾回收? - user705414
@user705414:不是(这就是为什么它被称为非确定性的原因)。 - vgru
如果在仍然引用包含该字段的实例时将 field 设置为 null,那么可以提前回收对象。只有在有特定原因时才这样做。 - SLaks

2

那个某人可能想表达的意思是,你可以通过将保存对该对象引用的变量设置为null来让GC在对象超出作用域之前回收它。这种技术过去在某些非常罕见的情况下曾经有过价值(例如,在不引用对象的长时间循环之前)。然而,现代编译器技术使得这种想法几乎无用,因为编译器足够聪明,能够检测到这些条件并做出相应的处理。


0

GC会在它想要的时候从内存中删除对象。您可以尝试运行System.gc(),但这只是一个提示,告诉GC它应该运行。当GC运行时,它会找到非引用对象(或仅具有弱引用等的对象)。GC的运行频率取决于内存空间。它最常在伊甸园空间中运行。默认情况下,当伊甸园空间满时,GC会在伊甸园空间中运行,但您可以调整JVM。

首先,为什么要打扰GC?你有什么问题吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接