阻止 Java VM 完成对象

Prevent Java VM from finalizing an object

有什么方法可以告诉 Java VM(在本例中为 HotSpot 或 Zing)不再像有 finalize 方法一样对待对象?真的,整个 class,我猜,如果可能的话。

我遇到了一些对象的问题,这些对象已经释放了资源,但仍然给认为需要调用 finalize 的 VM 施加压力。

这是在库中,因此无法更改 class。

用例是编写一个库来清理堆外资源,如果您忘记或决定让 GC 为您清理堆外资源。问题是我有很多人闲逛。

不,你不能这样做。它是 JVM 规范的一部分。也不清楚为什么要这样做;如果 VM 在清理时具有该方法,则 VM 将调用 finalize(),而不管之前发生了什么。如果您直接调用 finalize 并触发某种双重 finalize 错误,那么答案很简单:"Don't do that"

The use case is a library was written to clean up off-heap resources if you forgot or decided to let the GC do it for you.

为此,我们像 ByteBuffer 一样使用 Cleaner。这是更轻量级的资源清理方式。


编辑另一种选择是你可以

  • 获取 Finalizer.queue 并在按住 Finalizer.lock 的同时自行删除元素 您可以添加一个线程,该线程会定期清理不需要的元素队列。
  • 您可以将此队列替换为您自己的实现,以使其行为有所不同。例如首先不添加所选 class 的对象。

您唯一的选择是使用一个代理 (-javaagent),它将用一个空代理覆盖最终实现。 JVM 自动为每个具有非空 finalize 的 class 实例创建一个 FinalReference 对象(这就是 JVM (Oracle) 跟踪 finalizable 对象的方式)。你无法改变他的行为。