有没有办法告诉 Java VM(对于这种情况,HotSpot 或 Zing)不再将对象视为有 finalize 方法?真的,全班,我猜,如果可能的话。
我遇到了已经释放资源但仍然对认为需要调用 finalize 的 VM 施加压力的对象的问题。
这是在库中,因此无法更改类。
用例是一个库,如果您忘记或决定让 GC 为您清理堆外资源。问题是我让很多人闲逛。
您唯一的选择是使用一个代理(-javaagent),它将用一个空的代理覆盖 finalize 实现。JVM 自动为具有非空 finalize 的类的每个实例创建一个 FinalReference 对象(这就是 JVM (Oracle) 跟踪可终结对象的方式)。你无法改变他的行为。
用例是一个库,如果您忘记或决定让 GC 为您清理堆外资源。
为此,我们照常使用CleanerByteBuffer
。这是一种更轻量级的资源清理方式。
编辑另一个选择是你可以
Finalizer.queue
并删除元素Finalizer.lock
您可以添加一个线程,该线程定期清理不需要存在的元素队列。不,你不能这样做。它是 JVM 规范的一部分。也不清楚为什么要这样做;finalize()
如果清理时 VM 有该方法,则无论之前发生了什么,VM 都会调用。如果您直接调用 finalize 并触发某种双重 finalize 错误,那么答案很简单:“不要那样做”