1

有没有办法告诉 Java VM(对于这种情况,HotSpot 或 Zing)不再将对象视为有 finalize 方法?真的,全班,我猜,如果可能的话。

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

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

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

4

3 回答 3

3

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

于 2016-04-21T15:07:39.957 回答
1

用例是一个库,如果您忘记或决定让 GC 为您清理堆外资源。

为此,我们照常使用CleanerByteBuffer。这是一种更轻量级的资源清理方式。


编辑另一个选择是你可以

  • 在持有的同时自己获取Finalizer.queue并删除元素Finalizer.lock您可以添加一个线程,该线程定期清理不需要存在的元素队列。
  • 你可以用你自己的实现替换这个队列,所以它的行为不同。例如,首先不要添加所选类的对象。
于 2016-04-21T15:03:00.813 回答
0

不,你不能这样做。它是 JVM 规范的一部分。也不清楚为什么要这样做;finalize()如果清理时 VM 有该方法,则无论之前发生了什么,VM 都会调用。如果您直接调用 finalize 并触发某种双重 finalize 错误,那么答案很简单:“不要那样做”

于 2016-04-21T14:54:53.940 回答