直接内存不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,直接内存是JVM堆外的直接向操作系统申请的内存空间。通常直接内存的读写性能更高,因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java进程占用的总内存,基本等于虚拟机堆内存+直接内存(虚拟机栈等空间消耗相比之下就很少了,可以忽略)。
JDK8的HotSpot中,元数据区就位于直接内存,我们也可以使用NIO中的Direct Buffer相关API手动分配直接内存空间来处理数据。
之前章节我们介绍过-Xms
和-Xmx
能够指定JVM的堆内存大小,而直接内存不包含在这个参数指定的空间中,直接内存的最大值可以通过-XX:MaxDirectMemorySize
参数指定。
-XX:MaxDirectMemorySize:指定直接内存的上限,默认情况下直接内存限制为最大堆内存的85%,此外直接内存的分配也受到物理内存的限制,如果分配失败会报错OutOfMemoryError
。
此外还需要注意的是,由于直接内存不受JVM管理,jmap
等工具也无法直接查看其内存使用的情况,我们只能用Linux下的top
工具或是Windows的任务管理器来查看。