阻止Java VM完成对象

时间:2016-04-21 14:42:38

标签: java jvm finalize azul-zulu

有没有办法告诉Java VM(对于这种情况,HotSpot或Zing)不再像处理finalize方法那样处理对象?真的,全班同学,如果可能的话,我猜。

我遇到了已经释放资源的对象出现问题,但仍然会对认为需要调用最终版本的VM施加压力。

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

  

用例是一个库,用于清除堆外资源,如果您忘记或决定让GC为您执行此操作。

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

编辑另一种选择是你可以

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

答案 2 :(得分:0)

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