8

如果我有类似于以下的代码:

public Constructor(final Object o) {
    taskSystem.add(new CycleTask(15, 15, -1) {

        @Override
        public void execute() throws Throwable {
            //access o here every 15 cycles forever
        }
    });
}

如果有的话,什么时候会收集垃圾?只有当任务被收集后,还是因为它是最终的,所以它会永远留在内存中?

4

4 回答 4

9

o 一旦不再可访问,可能会收集垃圾,无论它是否是最终的。显然,只要在execute运行,如果需要访问o,就会阻止GC。

运行完成execute后,假设您没有存储任何对o(例如在集合中)的引用,它将被标记为准备好进行垃圾回收。

于 2012-05-31T21:45:32.240 回答
5

当匿名类实例有资格进行垃圾收集时,如果没有其他内容引用o调用该方法时引用的对象,则该对象将有资格进行垃圾收集。

阻止垃圾收集的最终变量没有什么特别之处。

于 2012-05-31T21:45:54.707 回答
3

'final' 对 GC 没有影响。当对象变得不可访问时,它就会有资格被收集。在这种情况下,至少有三个引用,其中任何一个都可以阻止它: 'final' 参数,当方法返回时消失;来电者的参考;以及匿名类实例中最终变量的副本。

于 2012-05-31T21:47:00.653 回答
2

final关键字和变量的生命周期之间没有关系。

当不再需要它时,它将被垃圾收集,并且由于它是一个参数,这可能发生在方法之外(如果外部没有引用)。

final关键字只是给编译器的一个约束,以禁止在调用函数后对引用进行任何进一步的修改o

于 2012-05-31T21:45:16.583 回答