直接内存 Direct Memory
-
不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域
-
直接内存是在java堆之外,直接向操作系统申请的内存
-
来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存
-
通常,访问直接内存性能速度会由于java堆.读写性能高
-
因此出于性能考虑,读写频繁的场合,可能会参考直接直接内存
-
javaNIO库允许java程序直接使用本地内存,可以用于数据缓冲区NIO中的Buffer
-
ByteBuffer buffer = ByteBuffer.allocate(1024*1024*1024)// 分配一个1G内存
-
非直接缓存区和缓存区
原来BIO架构,我们需要从用户态切换成内核态,NIO减少了用户地址空间到内核地址空间拷贝的过程,直接从应用程序到内核地址空间
存在的问题
- 也可能会出现OOM
- 由于直接内存在java堆之外,因此他的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是优先的,java堆和直接内存综合受限于操作系统能给与的最大内存
- 分配回收成本高
- 不收JVM内存回收管理
- 直接内存大小可以通过MaxDirectMemorySize设置,如果不指定默认与堆的最大值-Xmx一致