【问题标题】:Releasing Memory Allocated by Native Libraries in Java在 Java 中释放本地库分配的内存
【发布时间】:2019-04-11 02:19:32
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java memory-management native-code jocl


    【解决方案1】:

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

    基本上你给它一个 Runnable 来在资源被清理时执行。

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

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

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

    【讨论】:

    • 谢谢,彼得。清洁工就是我要找的东西,了解 Thread 也很好。
    • Java 9 的Cleaner 也使用引用队列和后台线程。它没有任何魔法。
    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2011-05-13
    • 2012-11-12
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多