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

时间:2018-11-07 15:55:54

标签: java memory-management native-code jocl

如果您正在运行用Java调用本机库的代码,那么当内存分配应在对象的整个生命周期内都可用时,释放这些库分配的内存的常用方法是什么?在C ++中,我将使用析构函数,但Java从未真正拥有析构函数和has them even less now

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

使用清理器的一个优点是您可以调用它确定性地进行清理,但是如果忘记或失败,GC将在运行后对其进行调用。

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

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