我想通过 JNA 将 byte[]
传递给本地方法。我发现的关于此类事情的所有示例要么使用 Memory
实例,要么使用直接分配的 ByteBuffer
然后获取 Pointer
从那开始。
但是,当我阅读文档时,他们说底层的 native 内存——据我所知,它是在JVM 管理的堆之外分配的——这些 Java 对象消耗只有在对象的 finalize()
方法被调用时才会被释放。
但是何时调用终结器与对象何时超出范围无关。在垃圾收集器真正完成它们之前,它们可能会停留很长时间。因此,他们分配的任何 native 内存在超出范围后将保持分配任意长的时间。如果他们持有大量内存和/或如果有很多对象,在我看来你有一个有效的内存泄漏。或者至少会有一个稳态内存消耗可能比它看起来需要的高很多。换句话说,与 JNA/ByteBuffer not getting freed and causing C heap to run out of memory 中描述的行为类似
JNA 有解决这个问题的方法吗?或者我是否需要为此放弃 JNA 并改用 JNI 以便我可以使用 JNIEnv::GetByteArrayElements()
因此不需要任何可以任意保留的“账外”内存分配长的?为了访问 dispose()
方法并使用它来释放我的时间轴上的底层 native 内存而不是 GC 的时间轴,是否可以对 Memory
进行子类化?或者当终结器运行时会导致问题吗?
最佳答案
JNA 提供了 Memory.disposeAll()
和 Memory.dispose()
来显式释放内存(后者需要你子类化 Memory
) ,因此如果您确实遇到了常规 GC 无法满足的内存压力,您可以使用一些额外的控制。
关于java - 使用 JNA 的 Memory 类是否存在内存泄漏问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33307311/