【发布时间】:2021-12-28 22:52:49
【问题描述】:
有没有办法在同时针对 jdk-8 和 jdk-11 时分配一个简单的堆外字节缓冲区(即不可能使用 Unsafe 或 VarHandle?
当前的解决方案依赖于RandomAccessFile,但目标是仅使用直接内存。
我正在尝试ByteBuffer.allocateDirect(),但看起来它仍然受到堆大小的限制。
* $JDK_16/bin/jshell -R-Xmx32m
jshell> java.nio.ByteBuffer.allocateDirect(33 * 1024 * 1024)
| Exception java.lang.OutOfMemoryError: Cannot reserve 34603008 bytes of direct buffer memory (allocated: 141, limit: 33554432)
| at Bits.reserveMemory (Bits.java:178)
| at DirectByteBuffer.<init> (DirectByteBuffer.java:121)
| at ByteBuffer.allocateDirect (ByteBuffer.java:330)
| at (#1:1)
【问题讨论】:
-
你想做什么需要堆外字节缓冲区?请edit您的问题包含对您正在尝试做的事情的更详细描述。这个问题看起来像XY problem。
-
ByteBuffer,从 (java) 1.4 开始
-
ByteBuffer.allocateDirect(capacity) -
@Stephen 但是 ByteBuffer 不受堆大小 (Xmx) 的限制吗?
-
使用 MappedByteBuffer docs.oracle.com/javase/7/docs/api/java/nio/… 你必须创建一个 FileChannel 并从那里映射来获取一个实例