既然Direct memory是物理内存,那么是不是不受限制呢,这个肯定不是的。
我们来一段程序:
public class Jvm1_10 { static int _10M=1024*1024*10; public static void main(String[] args) { List<Buffer> list=new ArrayList<>(); int i=0; try{ while (true){ ByteBuffer byteBuffer=ByteBuffer.allocateDirect(_10M); list.add(byteBuffer); i++; } }finally { System.out.println(i); } } }
执行结果:
364 Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory at java.nio.Bits.reserveMemory(Bits.java:694) at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123) at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) at Jvm1_10.main(Jvm1_10.java:19)
这个结果表明程序分配了364次,就内存溢出了,这说明我们程序是有控制的。我们加入代码:
System.out.println("maxDirectMemorym默认大小"+ VM.maxDirectMemory()/1024/1024+"MB");
输出:maxDirectMemorym默认大小3641MB
这个便是我们的默认配置,我们可以通过jvm参数控制这个默认值
-XX:MaxDirectMemorySize=20m
maxDirectMemorym默认大小20MB 2 Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory at java.nio.Bits.reserveMemory(Bits.java:694) at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123) at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) at Jvm1_10.main(Jvm1_10.java:20)