1、直接内存不是虚拟机运行时数据区的一部分,而是在Java堆外,直接向系统申请的内存空间

2、来源于NIO,通过存在堆中的 DirectByteBuffer 操作本地内存

1
2
3
4
5
6
7
8
9
private static final int BUFFER = 1024 * 1024 * 1024;//1GB
public static void main(String[] args){
//直接分配本地内存空间
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);
System.out.println("直接内存分配完毕");
byteBuffer = null;
System.out.println("直接内存开始释放!");
System.gc();
}

3、通常访问直接内存的速度会优于访问java堆的速度(读写性能更高,适用于读写频繁的场合)

4、java的NIO库运行java程序使用直接内存用于数据缓冲

5、直接内存大小可以通过MaxDirectMemorySize设置,如果不指定,默认与堆的最大值-Xmx参数值一致,但是由于直接内存在java堆外,因此它不会直接受限于-Xmx指定的最大堆大小,它和java堆受限于操作系统能给出的最大内存

6、简单理解: java process memory = java heap + native memory