47.直接内存
1.直接内存概述
1.直接内存不是虚拟机运行时数据区的一部分,也不是Java
虚拟机规范中定义的内存区域。
2.直接内存是在Java堆外,直接向系统申请的内存空间
3.Java
的NIO
库允许使用直接内存,用于数据缓冲区
4.直接内存的读写性能比堆高
2.IO
与NIO
对比
1.使用传统IO
读写文件,涉及到了用户态和内核态的切换,每次读数据,需要将数据线读取到操作系统内核态的地址空间的内存中,然后在读取到JVM
用户态的地址空间的内存中;写数据的时候需要先写到JVM
用户态的地址空间内存中,然后再写到操作系统内核态的内存中。内存中需要存储两份一样的数据,效率低下。
2.NIO
使用本地内存,不涉及到内核态与用户态的切换,读写文件都是直接操作的本地内存,读写效率更高。
3.直接内存的OOM
与内存大小设置
1.直接内存存在于堆外,它的大小受限于系统内存的大小,如果超过系统内存的大小,就会出现OOM
。
2.直接内存回收成本高,不受JVM
内存回收管理。
3.可以通过MaxDierctMemorySize
设置直接内存大小。如果不指定,则默认值与堆的最大值-Xmx
参数值一致