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

Col*_*lby 8 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
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

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

ass*_*ias 9

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

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


Jon*_*eet 5

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

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