如果您正在运行用Java调用本机库的代码,那么当内存分配应在对象的整个生命周期内都可用时,释放这些库分配的内存的常用方法是什么?在C ++中,我将使用析构函数,但Java从未真正拥有析构函数和has them even less now。
我最感兴趣的特定情况是JOCL,在这里我有一个对象,该对象包装已编译的OpenCL内核以及所有始终相同的参数。表示已编译内核和参数的结构都在库侧分配,JOCL提供了一种方法clReleaseMemObject
,您可以调用该方法来递减指示何时应删除对象的引用计数器(请注意,这与该对象有点不同)直接释放内存,但在这种情况下,我认为基本上没有。)
我认为,如果程序终止时对象仍然存在,则操作系统将清除所有内容,但是我不确定线程中创建的对象。所以:
如果要在垃圾回收对象时释放本机内存,是否有合适的位置调用释放该内存的方法?
如果对象是一个可以在线程持续时间内使用的对象,那么是否存在进行此调用的适当位置,或者甚至有必要这样做?
答案 0 :(得分:4)
您可以使用Cleaner。这是Java 9中更为正式的API,但在Java 1.4+中可用。
基本上,您为它提供了一个Runnable,以便在清理资源时执行。
使用清理器的一个优点是您可以调用它确定性地进行清理,但是如果忘记或失败,GC将在运行后对其进行调用。
当线程死亡时,没有一种安全的方法可以清理对象,因为Thread对象即使死了也可以在程序的生命期内生存。一种更简单的方法是清理,因为您知道不需要清理,或者在GC确定不需要清理之后。
另一种方法是使用参考队列和后台线程。它不那么优雅,但可以在Java 8和更高版本中使用。