在 Java 中释放本机库分配的内存
Releasing Memory Allocated by Native Libraries in Java
如果您是 运行 调用 Java 中的本机库的代码,当内存分配应持续到物体?在 C++ 中,我会使用析构函数,但 Java 从来没有真正拥有过那些 has them even less now.
我最感兴趣的具体情况是 JOCL, where I have an object that wraps a compiled OpenCL kernel and all of the arguments thereto that are always the same. Structures representing the compiled kernel and the arguments are all allocated on the library side, and JOCL provides a method clReleaseMemObject
你调用它来递减一个引用计数器,指示何时应该删除对象(请注意,这与直接释放内存有点不同,但是在这种情况下,我不这么认为)。
我假设如果对象在程序终止时仍然存在,那么所有内容都会被 OS 清除,但我不太确定在线程中创建的对象。所以:
如果您希望在对象被垃圾回收时释放本机内存,是否有合适的地方调用释放此内存的方法?
如果该对象将持续一个线程的持续时间,是否有适当的地方进行此调用,或者这是否必要?
你可以做的是使用 Cleaner。这是 Java 9 中更正式的 API,但在 Java 1.4+ 中可用。
基本上你给它一个 Runnable 来在清理资源时执行。
使用 Cleaner 的一个优点是您可以调用它来确定性地清理,但如果您忘记或没有这样做,GC 将在运行后调用它。
没有一种安全的方法可以在线程终止时清理对象,因为 Thread 对象即使已终止也可以在程序的整个生命周期内存活。一种更简单的方法是在您知道不需要或 GC 确定不需要之后进行清理。
另一种方法是使用引用队列和后台线程。它不是那么优雅,但适用于 Java 8 及更高版本。
如果您是 运行 调用 Java 中的本机库的代码,当内存分配应持续到物体?在 C++ 中,我会使用析构函数,但 Java 从来没有真正拥有过那些 has them even less now.
我最感兴趣的具体情况是 JOCL, where I have an object that wraps a compiled OpenCL kernel and all of the arguments thereto that are always the same. Structures representing the compiled kernel and the arguments are all allocated on the library side, and JOCL provides a method clReleaseMemObject
你调用它来递减一个引用计数器,指示何时应该删除对象(请注意,这与直接释放内存有点不同,但是在这种情况下,我不这么认为)。
我假设如果对象在程序终止时仍然存在,那么所有内容都会被 OS 清除,但我不太确定在线程中创建的对象。所以:
如果您希望在对象被垃圾回收时释放本机内存,是否有合适的地方调用释放此内存的方法?
如果该对象将持续一个线程的持续时间,是否有适当的地方进行此调用,或者这是否必要?
你可以做的是使用 Cleaner。这是 Java 9 中更正式的 API,但在 Java 1.4+ 中可用。
基本上你给它一个 Runnable 来在清理资源时执行。
使用 Cleaner 的一个优点是您可以调用它来确定性地清理,但如果您忘记或没有这样做,GC 将在运行后调用它。
没有一种安全的方法可以在线程终止时清理对象,因为 Thread 对象即使已终止也可以在程序的整个生命周期内存活。一种更简单的方法是在您知道不需要或 GC 确定不需要之后进行清理。
另一种方法是使用引用队列和后台线程。它不是那么优雅,但适用于 Java 8 及更高版本。