Java 复制DirectByteBuffers OutOfMemoryError 我打算使用一个直接缓冲区来连接一个C++语言编写的第三方库。p>

Java 复制DirectByteBuffers OutOfMemoryError 我打算使用一个直接缓冲区来连接一个C++语言编写的第三方库。p>,java,java-native-interface,Java,Java Native Interface,我因为说了这些话而感到担心: DirectByteBuffers通过使用幻象引用和引用队列进行垃圾收集。JVM每隔一段时间检查一次引用队列并清理DirectByteBuffers。但是,由于这不会在丢弃对DirectByteBuffer的所有引用后立即发生,因此使用DirectByteBuffers时很容易出错 首先,我不确定DirectByteBuffers的所有实现是否都是相同的,因为 似乎不使用幻影引用,但依赖于finalize方法,该方法应具有性能惩罚 其次,我尝试使用 public s

我因为说了这些话而感到担心:

DirectByteBuffers通过使用幻象引用和引用队列进行垃圾收集。JVM每隔一段时间检查一次引用队列并清理DirectByteBuffers。但是,由于这不会在丢弃对DirectByteBuffer的所有引用后立即发生,因此使用DirectByteBuffers时很容易出错

首先,我不确定DirectByteBuffers的所有实现是否都是相同的,因为 似乎不使用幻影引用,但依赖于finalize方法,该方法应具有性能惩罚

其次,我尝试使用

public static void main(String[] args) {
    for(;;){
        ByteBuffer buff = ByteBuffer.allocateDirect(1000*1000);
    }
}
而且似乎所有的东西都被正确的垃圾收集了。如果在我的机器上使用

java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-11M3635)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode)
我可以相信这会在其他每台机器上运行,并且java版本>=1.6吗


谢谢

这是Java 6早期版本中的一个bug。然而,JVM中包含的一个简单的解决方法是仅在触发System.gc()之后抛出OutOfMemoryError;现在,您可以通过禁用显式GCs来模拟此问题


我不会等待GC清理直接内存或内存映射文件,而是使用一个内部API,它适合基于OpenJDK的JVM,例如Hotspot。这通过减少伪全地面军事系统来提高性能

((DirectBuffer) buffer).cleaner().clean();

如果您有堆缓冲区,cleaner()将返回null。

这是Java 6早期版本中的一个错误。然而,JVM中包含的一个简单的解决方法是仅在触发System.gc()之后抛出OutOfMemoryError;现在,您可以通过禁用显式GCs来模拟此问题


我不会等待GC清理直接内存或内存映射文件,而是使用一个内部API,它适合基于OpenJDK的JVM,例如Hotspot。这通过减少伪全地面军事系统来提高性能

((DirectBuffer) buffer).cleaner().clean();
如果您有堆缓冲区,cleaner()将返回null。

是一篇关于这个主题的好文章

至于你的测试,像这样的简单测试并不能真正解决问题。当GC落后太远时,潜在的问题就会出现。在这样的测试中,GC没有做任何其他的事情,因此很可能不会有问题保持下去。

是关于这个主题的一篇很好的文章


至于你的测试,像这样的简单测试并不能真正解决问题。当GC落后太远时,潜在的问题就会出现。在这样的测试中,GC没有执行任何其他操作,因此很可能不会有问题。我考虑过手动释放内存,但是我必须确保不存在对该缓冲区的其他引用。我想手动释放内存,但是我必须确保不存在对这个缓冲区的其他引用。然后我不得不再次依赖幻影引用。Hadoop文档是错误的:它们将过程背对背。首先更改项目的可达性状态,然后将其附加到引用队列。JVM根本不“检查引用队列”:这取决于Java代码。事实上,我在源代码中根本找不到任何引用队列:也许它是在谈论它自己对DirectByteBuffers的使用?Hadoop文档是错误的:它们把过程放在了前面。首先更改项目的可达性状态,然后将其附加到引用队列。JVM根本不“检查引用队列”:这取决于Java代码。事实上,我在源代码中根本找不到任何引用队列:也许它在谈论自己对DirectByteBuffers的使用?