一、直接缓冲区与非直接缓冲区
1、非直接缓冲区:通过allocate() 方法分配的缓冲区,将缓冲区建立在JVM的内存中。
2、直接缓冲区:通过allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。(可以提高效率)
3.、isDirect() 方法可以判断是不是直接缓冲区
@Test
public void text3(){

    //分配非直接缓冲区
    ByteBuffer buff = ByteBuffer.allocate(1024);

    //分配直接缓冲区
    ByteBuffer buffs = ByteBuffer.allocateDirect(1024);

    //isDirect()判断是否是直接缓冲区
    System.out.println(buff.isDirect());//false
    System.out.println(buffs.isDirect());//true
}

 

二、为什么直接缓冲区比非直接缓冲区域更有效率
[NIO]——(二)直接缓冲区与非直接缓冲区_地址空间
应用程序想要读取物理磁盘中的数据时,物理磁盘会先将数据写入内核地址空间中,然后再复制一份一模一样的数据到JVM的地址空间中,最后再读入到应用程序中。
相对应的写入数据时,仍然要先写到JVM的地址空间中,再赋值一份一模一样的数据到内核地址空间中,最后再存入物理磁盘中。
 
2、直接缓冲区,如图:
 
[NIO]——(二)直接缓冲区与非直接缓冲区_数据_02
 
直接缓冲区是在物理磁盘与应用程序之间直接在物理内存中开辟了一块缓冲区。
相比于非直接缓冲区,应用程序与物理磁盘之间只隔着一个物理内存缓冲区,省去了复制一份一模一样的数据的过程。
 
三、直接缓冲区与非直接缓冲区的对比
1、相比于非直接缓冲区,直接缓冲区是在物理内存中开辟一块缓冲区,所以某些情况下更加耗费资源。
2、比较致命的一点是,当应用程序将数据写入到物理内存中时,数据就不属于应用程序可以操作的范围了,
例如物理内存中的数据什么时候写入物理磁盘则完全交给操作系统去控制了。
3、对于应用程序来说,必须要等待触发垃圾回收机制释放时才能与物理内存这条引用断开。但是垃圾回收机制的触发不是我们可以控制的,
虽然System.gc方法可以加快垃圾回收机制的运行,但是垃圾回收机制不会立刻运行。
 
注:由此可见直接缓冲区和非直接缓冲区都有不小的问题,所以下面学习了通道以后,就会有另一种获取直接缓冲区的方式,叫做内存映射文件。
 
随笔笔记整理于尚硅谷视频。视频地址:https://www.bilibili.com/video/BV14W411u7ro