我们是否必须手动释放分配的 ByteBuffer?

agi*_*iro 5 java nio lwjgl

我正在写一些使用ByteBuffers 的东西。在API的文档中它说

没有办法显式地释放缓冲区(没有 JVM 特定的反射)。缓冲区对象会受到 GC 的影响,在缓冲区对象变得不可访问后,通常需要两个 GC 周期才能释放堆外内存。

然而,在SO 帖子接受的答案中,我读到

BigMemory 通过直接 ByteBuffer 使用 JVM 进程的内存地址空间,与其他本机 Java 对象不同,BigMemory不受 GC 的影响

现在我该怎么办,我应该释放创建的缓冲区吗?或者我误解了文档或答案中的某些内容?

Kar*_*cki 3

这取决于您如何创建缓冲区,有很多可能的用例。常规ByteBuffer.allocate()将在堆上创建并由 GC 收集。其他选项(例如本机内存)可能不会。

Terracotta BigMemory 是一种不受 JVM GC 控制的原生堆外内存。如果您在这种类型的内存中分配缓冲区,则必须自己清除它。

即使缓冲区是在堆内存中分配的,清除缓冲区也可能是个好主意。GC 将负责收集未使用的缓冲区,但这需要一些时间。