在匿名类中使用最终变量时的垃圾收集

时间:2012-05-31 21:41:53

标签: java garbage-collection final

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

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 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:5)

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

最终变量没有什么特别可以阻止垃圾收集。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

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

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