阻止 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 对象的方式)。你无法改变他的行为。
有什么方法可以告诉 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 对象的方式)。你无法改变他的行为。