Java 通过自定义垃圾收集器防止本机内存泄漏?

Java 通过自定义垃圾收集器防止本机内存泄漏?,java,java-native-interface,native,Java,Java Native Interface,Native,假设我正在用java编写一个API,它引用一些本机C库,需要显式调用析构函数。如果未调用析构函数,则本机内存不足 有没有办法通过让垃圾收集器以某种方式调用析构函数来保护API用户不显式调用析构函数?(可能是基于我对所用本机内存大小的一些估计?) 我知道Java没有将垃圾收集器作为Java API的一部分,但也许有某种方法可以实现它?当Java对象即将成为GCd时,垃圾收集器将调用Java对象的finalize(),在finalize中,您可以调用析构函数。只需为每个需要调用的析构函数创建一个新的

假设我正在用java编写一个API,它引用一些本机C库,需要显式调用析构函数。如果未调用析构函数,则本机内存不足

有没有办法通过让垃圾收集器以某种方式调用析构函数来保护API用户不显式调用析构函数?(可能是基于我对所用本机内存大小的一些估计?)


我知道Java没有将垃圾收集器作为Java API的一部分,但也许有某种方法可以实现它?

当Java对象即将成为GCd时,垃圾收集器将调用Java对象的
finalize()
,在finalize中,您可以调用析构函数。只需为每个需要调用的析构函数创建一个新的Java对象,并保持对该Java对象的引用,直到您想要调用析构函数为止


实际上,
finalize()。唯一的例外是,当进程关闭时,如果对象仍然存在:那么它可能确实永远不会得到GCd。

除了使用finalize(),如果没有资源进行调用,您可能需要触发GC,但GC尚未运行

ByteBuffer.allocateDirect()存在此问题。它需要GC清除其字节缓冲区,但是,在触发GC之前,您可以达到最大直接内存,因此代码必须检测到这一点并显式触发
System.GC()


即使如此,等待GC清理也可能效率低下,如果需要,您可能希望公开一种显式清理资源的方法。

如果您可以控制对象的创建,则另一种方法是使用引用队列的构造函数使用WeakReference引用它们。当它们超出范围时,引用将排队,您可以让自己的线程轮询队列并调用一些清理函数

为什么?? 好的,它比向类中添加终结器稍微有效一些(因为它强制gc对它们进行一些特殊处理)

编辑:以下两个(同一篇文章的变体)描述了它:

Peter Lawrey说得很有道理:

即使如此,等待GC清理可能效率低下,如果需要,您可能希望公开一种显式清理资源的方法


无论何时您可以假设您的用户使用的是Java7,请看一看,因为它将帮助他们在使用新的资源时自动做到这一点。

这是一个用例,在Java对象上定义
.finalize()
,实际上非常有用!销毁其中的本机对象。还提供一个方法,以便用户可以自己执行(并在
finalize()
中大叫,如果没有调用该方法,这将教会他们)