一 直接内存概述
1)不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。
2)直接内存是在Java堆外的,直接向系统申请的内存空间。
3)来源于NIO,通过存在堆中的 DirectByteBuffer 操作 Native 内存
4)通常,访问直接内存的速度会优于Java堆,即读写性能好
- 因此出于性能考虑,读写频繁的场合可能考虑使用直接内存
- Java的NIO库允许Java程序使用直接内存,用于数据缓存区
@Test
public void test() {
ByteBuffer byteBuffer = ByteBuffer.allocate(BUFFER);
System.out.println("直接内存分配完毕");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("直接内存开始释放");
byteBuffer = null;
System.gc();
}
二 设置直接内存
1)也可能导致OOM异常
2)由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆内存。但是系统的内存也是有限的,Java堆和直接内存的总和依然是受限于操作系统能给出的最大内存。
3)缺点:分配回收成本较高,不受JVM内存回收管理。
4)直接内存大小可以通过参数:-XX:MaxDirectMemorySize设置。
5)如果不指定,默认与堆的最大值-Xmx参数值一致。