java - 使用 JNA 的 Memory 类是否存在内存泄漏问题?

标签 java memory memory-leaks java-native-interface jna

我想通过 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/

相关文章:

java - Swing 和 AWT : ContentPane items not showing in JFrame

c - 对 32 位地址空间使用 64 位整数迭代器?

android - 为什么在 Android Activity 中使用 LocationManager 单例不好?

java - Hibernate 中的 c3p0 中可能存在内存泄漏?

java - 使用蓝牙发送/接收数据的最低 Android API 级别(或最小 sdk)是多少?

java - 如何在Windows中的同一目录中复制给定不同名称的文件

ios - 基于可用 RAM 或 iOS 内存警告级别的自适应图像缓存

python - 执行笛卡尔积时如何减少内存消耗?

iphone - NSString stringWithFormat 调用 XX 次导致内存警告

java - DateTimeFormatter 一直不工作,错误?