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