标记要在GC中删除的对象

时间:2011-03-16 20:36:58

标签: java memory garbage-collection

有没有我可以在java中标记一个对象,以便在下次清理时进行垃圾回收?

我听说将对象设置为null不再有效。

4 个答案:

答案 0 :(得分:7)

不,你不能。如果另一个变量引用了它,你会发生什么?

请注意,您无法将对象设置为null - 您只能将变量设置为null。如果另一个变量仍然具有对该对象的引用,则它仍然不符合垃圾回收的条件。

如果您认为需要这样做,这可能意味着您误解了数据 - 或者您的代码中可能存在泄漏(例如,您只添加条目的列表,由静态变量引用 - 当类加载器处于活动状态时,这些条目永远不会有资格进行垃圾收集。

每个JVM都有自己的GC,但是在Hotspot中,当GC运行在当前“生活”对象的生成时,对象将被垃圾收集(假设它没有终结器,这使事情变得复杂)。如果对象处于“年轻”阶段,那很可能会很快发生 - 如果它处于“旧”阶段,则可能需要更长时间。

您可能希望查看Java 6 GC tuning documentation以获取更多信息,当然,从那时起,OpenJDK 7等事情已经发生了变化。

答案 1 :(得分:4)

我知道这个问题已经得到解答,但是有一些方法可以操纵Java垃圾收集器查看引用的方式。您可以通过Soft References,Weak References和Phantom References来完成此操作。请查看java.lang.ref包以获得更好的解释。

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ref/package-summary.html

此处还有一个很好的示例来确定PhantomReference何时将被垃圾收集。

http://exampledepot.8waytrips.com/egs/java.lang.ref/PhantomRef.html

以下是它的主要网站:

http://exampledepot.8waytrips.com/

答案 2 :(得分:2)

Java垃圾收集器使用标记和扫描方法。这意味着从已知仍在使用的对象中,遵循所有引用,并标记以这种方式访问​​的对象。这样就没有标记任何引用的对象,应该确保删除它们。因此,您可以确保删除对此对象的所有引用,以便在垃圾收集器的下一轮中删除该项。

另外你可以使用

Runtime.getRuntime().gc();

表示垃圾收集器应该运行。注意:您无法确定它是否真正运行。

答案 3 :(得分:1)

你听错了,但话又说错了。

您不将对象设置为null,将变量设置为null。如果变量可用于获取对象,则变量具有对象的“引用”。将变量设置为null与对象的“丢失引用”变量相同。

一旦Java检测到正在运行的程序无法访问某个对象或一组对象,它就会从内存中删除这些对象。它不会在一段时间内将它们从内存中删除,因为如果确实如此,并且程序的其他部分试图使用对象的引用,则引用将以Java中不允许的方式失败。

诀窍不是只设置一个null引用,你必须设置所有可能已经为null的引用。这就是为什么每次创建新引用都要考虑的原因,因为您希望以最终清除它们的方式创建它们(除非您想要内存泄漏)。