如果我的代码类似于以下内容:
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
}
});
}
什么时候会被垃圾收集,如果有的话?只有当任务被收集,或者它会永远留在记忆中,因为它是最终的?
答案 0 :(得分:9)
o
可能一旦无法再次访问就会收集垃圾,无论是否为最终版本。显然,只要execute
正在运行,如果需要访问o
,就会阻止GC。
当execute
完成运行,并假设您没有存储对o
的任何引用(例如在集合中)时,它将被标记为垃圾收集准备就绪。
答案 1 :(得分:5)
当匿名类实例符合垃圾收集条件时,如果没有其他内容引用调用该方法时o
引用的对象,则该对象将有资格进行垃圾收集。
最终变量没有什么特别可以阻止垃圾收集。
答案 2 :(得分:3)
'final'对GC没有影响。当对象无法访问时,该对象将有资格进行收集。在这种情况下,至少有三个引用,其中任何一个都可以阻止:'final'参数,当方法返回时消失;来电者的参考;和匿名类实例中的最终变量的副本。
答案 3 :(得分:2)
final
关键字与变量的生命周期之间没有关系。
当不再需要时,它将被垃圾收集,因为它是一个参数,这可能发生在方法之外(如果外面没有引用)。
final
关键字只是一个约束,允许编译器在调用函数后禁止对引用o
进行任何进一步的修改。