5

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

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

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

  1. 如果您希望在对象被垃圾回收时释放本机内存,是否有合适的地方调用释放此内存的方法?

  2. 如果对象是一个将持续一个线程持续时间的对象,是否有合适的地方进行此调用,或者这甚至是必要的吗?

4

1 回答 1

6

您可以做的是使用Cleaner。这是 Java 9 中更官方的 API,但在 Java 1.4+ 中可用。

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

使用 Cleaner 的一个优点是您可以调用它来确定性地进行清理,但如果您忘记或没有这样做,GC 将在运行后调用它。

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

另一种方法是使用参考队列和后台线程。它没有那么优雅,但适用于 Java 8 及更高版本。

于 2018-11-07T16:18:05.653 回答