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

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

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 } }); } 

什么时候会被垃圾收集,如果有的话? 只有当任务被收集,或者它将永远留在记忆中,因为它是最终的?

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

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

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

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

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

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

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

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