gpt4 book ai didi

java - NIO 直接缓冲区何时以及如何被释放?

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:03 27 4
gpt4 key购买 nike

我有一个 C 库需要一个临时缓冲区作为暂存空间。我正在考虑将直接字节缓冲区的地址传递给它。

  • 是否允许虚拟机在最终释放之前重新定位缓冲区?在 JNI 框架消失后, native 库将保留指针。我的理解是 JNI 本地对象引用不能被缓存,因为 VM 可能会在 GC 期间重新定位它们。这是否适用于缓冲区地址?

  • 我知道如果我在 Java 中分配一个缓冲区然后让缓冲区对象超出范围,VM 将释放缓冲区内存。如果我使用 NewDirectByteBuffer 在 native 代码中创建一个新缓冲区,谁负责释放后备内存?

  • 如果我使用 NewDirectByteBuffer 在 native 代码中创建一个新缓冲区并且地址已被直接缓冲区使用,会发生什么情况?内存会被双重释放吗?当引用它的最后一个缓冲区被垃圾回收时,VM 引用是否会对内存块进行计数并尝试释放它?

最佳答案

Is the VM ever allowed to relocate the buffer before it is ultimately freed?

它不会重新定位它,因为直接缓冲区不是 GC 堆的一部分。

If I create a new buffer in native code using NewDirectByteBuffer, whose responsibility is it to free the backing memory?

释放它是您的( native 代码)责任。 JVM 不知道使用什么方法来分配后备存储(可能是 malloc,可能是静态缓冲区等)

What happens if I create a new buffer in native code using NewDirectByteBuffer and an address already in use by a direct buffer?

鉴于 VM 不会尝试释放其地址传递给 NewDirectByteBuffer 的内存,因此如果您两次传递相同的地址,则不会发生任何事情。

关于java - NIO 直接缓冲区何时以及如何被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1246983/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com