释放Java中由本地库分配的内存

5
如果你在Java中运行调用本地库的代码,那么通常的方法是什么来释放这些库分配的内存,当内存分配应该持续对象的生命周期?在C++中,我会使用析构函数,但是Java从来没有真正拥有过这些,并且现在甚至更少
我最感兴趣的特定情况是JOCL,其中我有一个包装编译后的OpenCL内核及其始终相同的所有参数的对象。表示编译后的内核和参数的结构都在库侧分配,JOCL提供了一个方法clReleaseMemObject,您可以调用该方法来减少引用计数器,指示何时删除对象(请注意,这与直接释放内存有所不同,在这种情况下可能并不重要)。
我认为如果对象在程序终止时仍存在,则操作系统会清理所有内容,但是我对在线程中创建的对象并不确定。所以:
1. 如果您希望在垃圾回收对象时释放本地内存,是否有适当的位置来调用释放内存的方法?
2. 如果该对象将持续存在于线程的整个生命周期中,是否有适当的位置来进行此调用,或者这是否必要?
1个回答

7
你可以使用Cleaner来完成。在 Java 9 中,这是一种更正式的 API,但在 Java 1.4+ 中也可用。
基本上,你需要为其提供一个 Runnable 来在资源清理时执行。
使用 Cleaner 的一个优点是可以确定性地调用它进行清理,但如果你忘记或未能这样做,GC 将在运行后调用它。
当线程结束时,没有安全的方式来清除对象,因为即使已死,Thread 对象仍然可能存活于程序的整个生命周期中。更简单的方法是在知道不再需要该对象时或在 GC 确定不再需要它时清理它。
另一种方法是使用引用队列和后台线程。这并不像 Cleaner 那样优雅,但可适用于 Java 8 及更高版本。

谢谢,彼得。清理器正是我所需要的,也很高兴了解到关于线程的知识。 - charleslparker
1
Java 9的“Cleaner”也使用引用队列和后台线程。它并没有任何神奇的东西。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接