直接内存
- 不是虚拟机运行时数据区的一部分,也不是JVM规范定义的内存区域
- Java堆外的、直接向系统申请的本地内存
- 来源NIO(new IO / Non-Blocking IO),通过堆中的DirectoryBuffer操作Native内存
- 通常访问直接内存的速度高于Java堆,即读写性能高
- 可能出现OOM异常(Direct buffer memory),因为堆空间较大,直接内存空间较小
- 分配回收成本较高
- 不受JVM内存管理
public class BufferTest {
private static final int BUFFER = 1024 * 1024 * 1024; //1GB
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();
scanner.next();
}
}
// allocateDirect 源码
public static ByteBuffer allocateDirect(int capacity) {
return new DirectByteBuffer(capacity);
}
简单理解:内存空间= 堆空间 + 本地内存(直接内存)