直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域。但是这部分内存也被频繁的使用,而且也可能导致OutOfMemoryError异常出现。
在java中的NIO类,引入了一种基于通道channel与缓冲区buffer的I/O方式,它可以使用native函数库直接分配对外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块内存的应用进行操作。这样能在一些场景中显著提高性能,因为避免了在java堆和native堆中来回复制数据。
本机直接内存的分配不受java堆大小的限制,但是既然是内存,肯定还是受本机总内存(包括RAM以及SWAP区或者分页文件)大小以及处理器寻址空间的限制。如果设置虚拟机参数是忽略直接内存可能会使得内存区域总和大于无力内存限制从而导致动态扩展是出现内存溢出异常。
网友评论