首页 > 解决方案 > JNA 内存清理

问题描述

根据JNA for Memory 类的文档,当需要释放不再引用的内存时,需要调用 finalize() 方法。但是在JNA 示例中,提到了 Memory 对象在超出范围时被释放。

// note: like Memory, StringArray will free the contiguous block of memory it copied the Strings into when the instance goes out of scope

问题是:

标签: javamemory-managementmemory-leaksnativejna

解决方案


为了根据所提出的具体问题详细说明Matthias Bläsing 的回答,我想补充几点:

  • 你一般不会直接调用finalize(). 它被 JVM 作为垃圾收集过程的一部分调用。
  • 在方法Memoryfinalize()简单地调用dispose()方法。如果您真的想立即摆脱内存,这将是首选的调用方法。但是,dispose()如果您真的觉得需要清理本机内存分配,则 protected需要扩展以利用此方法。Memory
    • 您可能会考虑的一个这样的子类是 extends Closeable,其中方法实现从超类close()调用。dispose()然后你可以,例如,使用资源块的尝试,并在块的末尾清理本机内存(资源)。当然,在 GC 之前,Java 对象仍然存在。
    • 但是请注意,释放本机内存会带来处理成本,除非您的内存真的很短缺,否则它不会获得太多收益,因为您仍然拥有与对象关联的 Java 堆内存,直到它被 GC'd。如果您的内存太少并且要进入该级别的详细信息来控制本机分配清理的时间,您可能希望直接转到malloc()free()调用自己并在更高级别控制它,也许是回收/重用它。 ..

您还询问了StringArray,但更接近平行的MemoryNativeString作为数组成员的对象。事实上,它们的内部实现是一个StringMemory扩展的对象,Memory因此它的行为相同;也就是free()本机内存通过dispose()viafinalize()点处NativeString是JVM垃圾回收。


推荐阅读