背景
继续整理JVM的学习笔记
概述
直接内存不是虚拟机定义的内存空间,是直接向系统申请的内存空间,来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存。
读写性能高,对于IO频繁的场景可以使用NIO。
public class BufferTest {
private static final int BUFFER = 1024 * 1024 * 1024;
public static void main(String[] args) {
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER); // 分配本地内存空间
System.out.println("直接内存分配完成");
Scanner scanner = new Scanner(System.in);
scanner.next();
System.out.println("直接内存释放");
byteBuffer = null;
System.gc(); // 直接内存不受GC管理
scanner.next();
}
}
如果使用jvm内存读写数据,要由用户态切换到内核态,进行数据的复制和写入磁盘

如果使用直接内存,就不会用用户态内核态相互复制的过程,将会写到物理内存映射文件,直接写入物理磁盘上。

直接内存也可能导致OOM异常,并且他的大小不直接受限于-Xmx指定的最大堆大小
它也有缺点:分配回收成本高;不受JVM的内存回收管理
直接内存大小可以通过MaxDirectMemorySize设置,默认与堆的最大值-Xmx参数值一致
492

被折叠的 条评论
为什么被折叠?



