标记要在GC中删除的对象

mon*_*ksy 10 java memory garbage-collection

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

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

Jon*_*eet 7

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

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

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

每个JVM都有自己的GC,但在热点的对象将是垃圾收集的GC运行在在(假设它不会有一个终结,这会使事情变得复杂)对象当前"生活"产生下一次.如果对象处于"年轻"阶段,那很可能会很快发生 - 如果它处于"旧"阶段,则可能需要更长时间.

您可能希望查看Java 6 GC调优文档以获取更多信息,当然,从那时起,OpenJDK 7等已经发生了变化.


jlu*_*ick 6

我知道这个问题已经得到解答,但是您可以通过多种方式来操纵 Java 垃圾收集器查看您的引用的方式。您可以通过软引用、弱引用和幻像引用来做到这一点。查看java.lang.ref 包以获得更好的解释。

这里还有一个很好的示例,用于确定 PhantomReference 何时将被垃圾收集:

幻像引用用于确定对象何时即将被回收。幻影引用比终结更安全,因为一旦对象幻影可达,它就无法复活。

// Create the phantom reference.
ReferenceQueue rq = new ReferenceQueue();
PhantomReference pr = new PhantomReference(object, rq);

// Wait until the object is about to be reclaimed.
try {
    while (true) {
        Reference r = rq.remove();
        if (r == pr) {
            // The object is about to be reclaimed.
            // Clear the referent so that it can be reclaimed.
            r.clear();
        }
    }
} catch (InterruptedException e) {
}
Run Code Online (Sandbox Code Playgroud)