`ByteBuffer.allocateDirect`和Xmx

时间:2018-05-24 00:26:56

标签: java memory-management

根据various sources(虽然在JavaDoc中没有特别提及),ByteBuffer.allocateDirect从主JVM堆中分配内存。我可以确认使用Java Mission Control,看到调用ByteBuffer n = ByteBuffer.allocateDirect(Integer.MAX_VALUE)的程序没有使用大量的Java堆内存:

enter image description here

但是,当限制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,   混合模式)

预期XmxByteBuffer.allocateDirect之间会出现这种行为吗?

编辑:JDK 1.7中似乎存在(不可重现的)bug,具有与上述相同的行为。这是一个错误吗?

0 个答案:

没有答案