jvm 直接内存
直接内存使用的是系统内存,java nio使用native函数获得堆外内存;
使用DirectByteBuffer对这块内存进行引用,避免了heap堆与堆外内存的复制;
直接内存的申请相较堆内存慢,但是访问速度较快,对频繁使用的空间,使用直接内存可提升效率
**************************
相关参数
-XX:MaxDirectMemorySize:设置直接内存的大小,默认等于-Xmx的值
当堆、栈、直接内存、虚拟机使用内存达到系统内存后,就会抛出OutOfMemoryError;
对直接内存设置合理的最大值,进行垃圾回收,可减少内存空间不足错误
**************************
示例
public class Test9 {
private static int _1m=1024*1024;
public static void main(String[] args){
ByteBuffer b=ByteBuffer.allocateDirect(_1m*10);
}
}
*********************
虚拟机参数
-XX:MaxDirectMemorySize=6m
*********************
控制台输出
Exception in thread "main" java.lang.OutOfMemoryError: Cannot reserve 10485760 bytes of direct buffer memory (allocated: 8192, limit: 6291456)
at java.base/java.nio.Bits.reserveMemory(Bits.java:178)
at java.base/java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:120)
at java.base/java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:329)
at runtime.Test9.main(Test9.java:10)
说明:ByteBuffer申请的直接内存超过了最大限制,报错OutOfMemoryError