gpt4 book ai didi

java - 复制 DirectByteBuffers OutOfMemoryError

转载 作者:行者123 更新时间:2023-12-01 19:04:03 25 4
gpt4 key购买 nike

我计划使用 DirectByteBuffers 来连接用 C++ 编写的第三方库。

我很担心the hadoop docs说:

DirectByteBuffers are garbage collected by using a phantom reference and a reference queue. Every once a while, the JVM checks the reference queue and cleans the DirectByteBuffers. However, as this doesn't happen immediately after discarding all references to a DirectByteBuffer, it's easy to OutOfMemoryError yourself using DirectByteBuffers.

首先,我不确定 DirectByteBuffers 的所有实现是否都相同,因为 OpenJDK 7似乎没有使用幻像引用,而是依赖于finalize方法,这应该会带来性能损失。

其次,我尝试使用复制 OutOfMemoryError

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 早期版本中的一个错误。但是,JVM 中包含的一个简单解决方法是仅在触发 System.gc() 后抛出 OutOfMemoryError;现在您可以通过禁用显式 GC 来模拟此问题。

Source for java.nio.Bits.reserveMemory(long)

<小时/>

我不会等待 GC 清理直接内存或内存映射文件,而是使用适合基于 OpenJDK 的 JVM 的内部 API,例如热点。这通过减少虚假的 Full GC 来提高性能。

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

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

关于java - 复制 DirectByteBuffers OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10934603/

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