JAVA NIO Bytebuffer.allocateDirect()的大小限制是否超过int类型?

3
我正在尝试制作离堆内存缓冲区。我想要非常大的大小(如10GB)缓冲区。 我听说JVM堆有时会因为完整GC而冻结。因此,我尝试使用java.nio.ByteBuffer来制作缓冲区。
但是,我遇到了很大的困难!
java.nio.ByteBuffer.allocateDirect(int size)

函数只支持整数,但我想要更大的尺寸。我该怎么办?请帮助我,Stack Overflow 大神们。

我的开发环境是 MacBook Pro,i7 2.4GHz,16GB DDR3,250SSD,OSX 10.9,Eclipse Kepler x64。

我尝试了一些方法来解决这个问题:

ByteBuffer buffer = ByteBuffer.allocateDirect(1024*1024*2000);
ByteBuffer buffer1 = ByteBuffer.allocateDirect(1024*1024*2000);
ByteBuffer buffer2 = ByteBuffer.allocateDirect(1024*1024*2000);
ByteBuffer buffer3 = ByteBuffer.allocateDirect(1024*1024*2000);

但是这并不起作用。只需再次分配1024*1024*2000的内存即可。
请帮帮我。
1个回答

1

你不能制作一个那么大的单个缓冲区。这是不可能的。你可以制作几个较小的缓冲区,并在自己的代码中根据需要选择它们。这就是你所能做的。

e.g.:

ByteBuffer[] myBuffers = new ByteBuffer[howMany];
for (int x = 0; x < howMany; x++) {
    myBuffers[x] = ByteBuffer.allocateDirect(prettyBig);
}

然后

byte getByte(long index) {
    int bufx = index / howMany;
    int bx = index % howMany;
    return myBuffers[bufx].get(bx); 
}

那么你的意思是,如果我多次创建小缓冲区,它们的总大小可能超过2^31吗?当我多次分配内存时,我看不到内存增加。我该怎么办?你能给我展示一些代码片段吗? - tyjang
1
请注意,您可能需要使用 -XX:MaxDirectMemorySize 来调整 JVM 允许分配给直接字节缓冲区的内存量。默认行为因版本、厂商、架构和其他选项而异。 - Brett Okken
你为什么认为你需要那么大的缓冲区? - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接