我处于一个我希望通过JNA将byte[]
传递给本机方法的位置。我发现的有关此类事件的所有示例都使用Memory
实例或使用直接分配的ByteBuffer
,然后从中获取Pointer
。
然而,当我阅读文档时,他们会说底层的本机内存 - 据我所知,它已经分配了#34;#34; 在JVM托管堆之外 - 这些Java对象仅在对象'调用finalize()
方法。
但是当调用终结器时,与对象超出范围无关。在垃圾收集器实际完成它们之前,它们可能会闲置很长时间。因此,他们分配的任何本机内存在超出范围后将在任意长时间内保持分配状态。如果他们持有大量内存和/或如果有很多对象,我觉得你有一个有效的内存泄漏。或者至少会有一个稳态内存消耗可能比它看起来需要的高很多。换句话说,与JNA/ByteBuffer not getting freed and causing C heap to run out of memory
中描述的内容类似 JNA是否有解决此问题的方法?或者我是否需要放弃JNA并使用JNI,以便我可以使用JNIEnv::GetByteArrayElements()
,因此不需要任何" off the books"内存分配可以持续任意长吗?是否可以继承Memory
以便访问dispose()
方法并使用它来释放我的时间轴上的底层本机内存而不是GC的时间轴?或者,当终结器运行时会导致问题吗?
答案 0 :(得分:3)
JNA提供Memory.disposeAll()
和Memory.dispose()
明确释放内存(后者要求你继承Memory
),所以如果做曾经遇到内存压力常规GC不够用,您可以使用其他控件。