Cleaner.register()
捕获引用的 Runnable
进行注册的情况。
如果引用被捕获,它将永远不是虚可达的,且永远不会调用清理操作。
此问题的可能来源:
this
本身的 lambda将报告的代码示例:
int fileDescriptor;
Cleaner.Cleanable cleanable = Cleaner.create().register(this, () -> {
System.out.println("adsad");
//this 通过 fileDescriptor 捕获
fileDescriptor = 0;
});
仅当项目或模块的语言级别为 9 或更高时,此检查才会报告。
2018.1 最新变化