Java 使用JNA'时是否存在内存泄漏问题;什么是记忆类?

Java 使用JNA'时是否存在内存泄漏问题;什么是记忆类?,java,memory,memory-leaks,java-native-interface,jna,Java,Memory,Memory Leaks,Java Native Interface,Jna,我想通过JNA将byte[]传递给本机方法。我找到的关于这类事情的所有示例要么使用内存实例,要么使用直接分配的字节缓冲区,然后从中获取一个指针 然而,当我阅读文档时,他们说底层本机内存(据我所知,它是在JVM管理的堆之外分配的),这些Java对象只在调用对象的finalize()方法时才会被释放 但是,当调用终结器时,与对象超出范围无关。在垃圾收集器真正完成它们之前,它们可能会停留很长时间。因此,它们分配的任何本机内存在超出作用域后都会在任意长的时间内保持分配状态。若他们持有大量内存和/或存在大

我想通过JNA将
byte[]
传递给本机方法。我找到的关于这类事情的所有示例要么使用
内存
实例,要么使用直接分配的
字节缓冲区
,然后从中获取一个
指针

然而,当我阅读文档时,他们说底层本机内存(据我所知,它是在JVM管理的堆之外分配的),这些Java对象只在调用对象的
finalize()
方法时才会被释放

但是,当调用终结器时,与对象超出范围无关。在垃圾收集器真正完成它们之前,它们可能会停留很长时间。因此,它们分配的任何本机内存在超出作用域后都会在任意长的时间内保持分配状态。若他们持有大量内存和/或存在大量对象,那个么在我看来,你们可能存在有效的内存泄漏。或者至少会有一个稳定状态的内存消耗可能比它看起来需要的要高得多。换句话说,类似于中描述的行为


JNA有没有办法解决这个问题?或者我需要为此放弃JNA而改用JNI,这样我就可以使用
JNIEnv::GetByteArrayElements()
,这样就不需要任何可以持续任意长时间的“现成”内存分配了?子类
Memory
以访问
dispose()
方法并使用该方法在我的时间线上而不是GC的时间线上释放底层本机内存是否可以接受?或者,当终结器确实运行时,这会导致问题吗?

JNA提供
内存.disposeAll()
内存.dispose()
来显式释放内存(后者要求您对
内存
进行子类化),因此,如果您确实遇到过常规GC无法满足的内存压力,您有一些额外的控件可用。

我不担心这一点-垃圾收集器将在堆已满且试图分配更多内存时被调用,因此它只在需要时运行。问题是,据我所知,这类对象占用的GC托管堆空间最小,但占用的非托管进程内存空间明显更多。因此,在GC看到足够的堆“压力”来完成任务之前,进程可能会占用大量内存。请看我在主要问题描述中添加的链接。啊,是的。。根据你链接的页面上的一个链接,这是一个从2001年开始打开的问题,仍然没有解决。我想对你的问题的简短回答是“是的”。最后一个建议是:如果
malloc
失败,您可以从本机代码调用它,而不是像解决方案中建议的那样定期调用
System.gc()