非直接缓冲区
非直接缓冲区通过allocate()方法分配缓冲区,将缓冲区建立在JVM的内存中
读: 读物理磁盘文件时候,先到物理内存读到,然后拷贝到jvm内存中。 程序去jvm读取。 从物理空间拷贝到jvm内存空间,效率慢。
写: 先写到jvm内存,jvm拷贝到物理内存,然后再到物理磁盘。
直接缓冲区
直接缓冲区通过allocateDirect()方法分配缓冲区,将缓冲区建立在物理内存中。直接缓冲区还可以通过 FileChannel 的 map() 方法将文件区域直接映射到内存中来创建。该方法返回 MappedByteBuffer 。
写: 直接写到物理内存映射文件,到物理磁盘
读: 物理磁盘文件读到物理内存映射文件,然后读取
小结
非直接缓冲区: 相对直接缓冲区来说,效率较低, 但是占用资源较少,容易被释放
直接缓冲区: 优点:IO操作性能高
特点:分配资源消耗大 位于堆栈内存之外 不容易被垃圾回收器所回收(不安全)
应用:一般将直接缓冲区分配给易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。