根据various sources(虽然在JavaDoc中没有特别提及),ByteBuffer.allocateDirect
从主JVM堆中分配内存。我可以确认使用Java Mission Control,看到调用ByteBuffer n = ByteBuffer.allocateDirect(Integer.MAX_VALUE)
的程序没有使用大量的Java堆内存:
但是,当限制JVM堆内存时,此堆外内存分配将停止工作。例如,当我使用-Xmx1g
选项运行JVM时,allocateDirect
调用会导致以下异常:Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
。我不完全理解这个JVM选项如何与堆外直接内存分配相关,因为 - 根据documentation - -Xmx
选项设置Java堆空间大小。如果我使用getUnsafe().allocateMemory(Integer.MAX_VALUE);
分配内存,则会成功分配内存。我的JVM如下:
java版“10”2018-03-20 Java(TM)SE运行时环境18.3 (build 10 + 46)Java HotSpot(TM)64位服务器VM 18.3(版本10 + 46, 混合模式)
预期Xmx
和ByteBuffer.allocateDirect
之间会出现这种行为吗?