释放Java中本机库分配的内存

cha*_*ker 5 java memory-management native-code jocl

如果您正在运行的代码调用Java中的本机库,那么当内存分配应在对象的生命周期内持续时,释放这些库分配的内存的常用方法是什么?在C ++中,我将使用析构函数,但是Java从来没有真正使用过析构函数,现在更少了

我最感兴趣的特定情况是JOCL,其中有一个对象,该对象包装已编译的OpenCL内核以及所有始终相同的参数。表示已编译内核和参数的结构都在库侧分配,JOCL提供了一种方法clReleaseMemObject,您可以调用该方法来递减指示何时应删除对象的引用计数器(请注意,这与直接释放内存有些不同,但在这种情况下,我基本上不这么认为。

我假设如果程序终止时该对象仍然存在,则操作系统将清除所有内容,但是我不确定线程​​中创建的对象。所以:

  1. 如果要在垃圾回收对象时释放本机内存,是否有合适的位置调用释放该内存的方法?

  2. 如果对象是将在线程持续时间内持续的对象,那么是否存在进行此调用的适当位置,或者甚至有必要这样做吗?

Pet*_*rey 6

您可以使用清洁剂。这是Java 9中更正式的API,但在Java 1.4+中可用。

本质上,您给它提供了一个Runnable,以便在清理资源时执行。

使用Cleaner的优点之一是可以确定性地对其进行清理,但是如果忘记或不这样做,GC将在运行后对其进行调用。

当线程死亡时,没有一种安全的方法来清理对象,因为Thread对象即使死了也可以在程序的生命期内生存。一种更简单的方法是根据您的了解进行清理,或者在GC确定不需要之后进行清理。

另一种方法是使用参考队列和后台线程。它不那么优雅,但是可以在Java 8和更高版本中使用。