gpt4 book ai didi

java - 如何强制垃圾收集器在清理未使用对象的引用之前首先调用 finalize 方法

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:17 25 4
gpt4 key购买 nike

我有一个使用 JNA 的 C 库的场景:
我重写了 finalize 方法,我在其中发送调用以删除通过 C 创建的对象。
我的代码看起来有点像这样:

protected void finalize() throws Throwable
{
if (LicensingAPIHelper.instance == null)
throw new NullPointerException("LicensingAPIHelper is not initialized");
LicensingAPIHelper.instance.sntl_licensing_app_context_delete(nativeAppContext.getValue());
}

sntl_licensing_app_context_delete 是API,删除在C库中创建的对象。
nativeAppContext是PointerByReference,nativeAppContext.getValue()发送要删除对象的指针。
现在正在发生的事情是,当 GC 被调用时发生崩溃,因为 nativeAppContext 引用首先被 GC 清除并且因为它没有找到任何引用所以当它试图获取发送到 C 的值时库崩溃了。

有什么方法可以强制 GC 在清理对象之前先调用 finalize 方法?

在这种情况下,我假设 GC 首先清理对象,然后调用 finalize 方法。

最佳答案

是且仅保证在对象被 GC 清理之前调用 finalize() 方法。

您尝试做的不是 finalize() 的用途。我从来不知道 GC 何时会清理您使用的实例。它不像 C++ 中的析构函数。它不会在变量超出范围后立即被调用。因此,将 finalize() 用于您的清理代码将使您的 C 库保持打开状态的时间比需要的时间长得多。

您正在寻找的可能是接口(interface) java.io.Closeablejava.lang.AutoCloseable 的 close() 方法。

与其将您的代码放在 finalize() 方法中,不如将其放在其中并标记您的类 implements AutoCloseable。然后,当您构建类的实例时,使用 try-with-resouces block 。退出此 block 时,将自动调用 close() 方法。

try (MyClass myInstance = new MyClass()) {
// use myInstance here
}
// myInstance.close() will have been called here automatically

关于java - 如何强制垃圾收集器在清理未使用对象的引用之前首先调用 finalize 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32794997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com