使用 JNA 的 Memory class 是否存在内存泄漏问题?
Is there a memory leak issue with using JNA's Memory class?
我想通过 JNA 将 byte[]
传递给本机方法。我发现的关于此类事情的所有示例要么使用 Memory
实例,要么使用直接分配的 ByteBuffer
,然后从中获得 Pointer
。
但是,当我阅读文档时,他们说底层本机内存——据我所知,它是在 JVM 管理的堆 之外分配的 "off the books" - - 这些 Java 对象消耗只有在对象的 finalize()
方法被调用时才会被释放。
但是何时调用终结器与对象何时超出范围无关。在垃圾收集器真正完成它们之前,它们可能会停留很长时间。因此,他们分配的任何本机内存在超出范围后将保持分配任意长的时间。如果他们持有大量内存 and/or 如果有很多对象,在我看来你有一个有效的内存泄漏。或者至少会有一个稳态内存消耗可能比它看起来需要的高很多。换句话说,类似于 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 的时间轴是否可以接受?或者当终结器执行 运行 时会导致问题吗?
JNA 提供 Memory.disposeAll()
和 Memory.dispose()
来显式释放内存(后者需要您子类化 Memory
),所以如果您 do曾经遇到常规 GC 不足以解决的内存压力,您可以使用一些额外的控制。
我想通过 JNA 将 byte[]
传递给本机方法。我发现的关于此类事情的所有示例要么使用 Memory
实例,要么使用直接分配的 ByteBuffer
,然后从中获得 Pointer
。
但是,当我阅读文档时,他们说底层本机内存——据我所知,它是在 JVM 管理的堆 之外分配的 "off the books" - - 这些 Java 对象消耗只有在对象的 finalize()
方法被调用时才会被释放。
但是何时调用终结器与对象何时超出范围无关。在垃圾收集器真正完成它们之前,它们可能会停留很长时间。因此,他们分配的任何本机内存在超出范围后将保持分配任意长的时间。如果他们持有大量内存 and/or 如果有很多对象,在我看来你有一个有效的内存泄漏。或者至少会有一个稳态内存消耗可能比它看起来需要的高很多。换句话说,类似于 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 的时间轴是否可以接受?或者当终结器执行 运行 时会导致问题吗?
JNA 提供 Memory.disposeAll()
和 Memory.dispose()
来显式释放内存(后者需要您子类化 Memory
),所以如果您 do曾经遇到常规 GC 不足以解决的内存压力,您可以使用一些额外的控制。