• 非直接缓冲区

    通过allocate()方法分配缓冲区,将缓冲区建立在JVM的内存之中。
    应用程序和磁盘之间想要传输数据,没办法直接进行传输,操作系统处于安全的考虑,会经过物理磁盘、内核地址空间、用户地址空间、应用程序几个步骤。假如应用程序想从磁盘中读取一个数据,这时候应用程序会向操作系统发起一个读请求,那么磁盘中的数据会被读取到内核地址空间中,然后会把内核地址空间中的数据拷贝到用户地址空间中(JVM内存中),最后再把数据读取到程序中。

    • 直接缓冲区

    通过allocateDirect()方法分配缓冲区,将缓冲区建立在物理内存之中。
    直接用物理内存作为缓冲区,会经过物理磁盘、物理内存映射文件、应用程序这几个步骤,读写数据直接通过物理内存进行。

    1. public static void demo3() {
    2. ByteBuffer byteBuffer = ByteBuffer.allocateDirect(2014);
    3. System.out.println(byteBuffer.isDirect());
    4. }

    通过isDirect()方法来判断是否为直接缓冲区。