美文网首页
Java NIO(3) - 直接与非直接缓冲区

Java NIO(3) - 直接与非直接缓冲区

作者: 21号新秀_邓肯 | 来源:发表于2020-05-12 16:20 被阅读0次

3.5 直接与非直接缓冲区

3.5.1 基本介绍

  • 字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则 Java 虚拟机会尽最大努力直接在此缓冲区上执行本机 I/O 操作。也就是说,在每次调用基础操作系统的一个本机 I/O 操作之前(或之后),虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。

  • 直接字节缓冲区可以通过调用此类的 allocateDirect() 工厂方法来创建。此方法返回的缓冲区进行分配和取消分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,因此,它们对应用程序的内存需求量造成的影响可能并不明显。所以,建议将直接缓冲区主要分配给那些易受基础系统的本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。

  • 直接字节缓冲区还可以通过 FileChannel 的 map() 方法 将文件区域直接映射到内存中来创建。该方法返回MappedByteBuffer 。Java 平台的实现有助于通过 JNI 从本机代码创建直接字节缓冲区。如果以上这些缓冲区中的某个缓冲区实例指的是不可访问的内存区域,则试图访问该区域不会更改该缓冲区的内容,并且将会在访问期间或稍后的某个时间导致抛出不确定的异常。

  • 字节缓冲区是直接缓冲区还是非直接缓冲区可通过调用其 isDirect() 方法来确定。提供此方法是为了能够在性能关键型代码中执行显式缓冲区管理。

3.5.2 图解

非直接缓冲区

image.png

直接缓冲区

image.png
    /**
     * 非直接缓冲区   : 通过allocate() 方法分配缓冲区, 将缓冲区简历在 JVM 的内存中
     * 直接缓冲区    : 通过 allocateDirect() 方法分配直接缓冲区,将缓冲区简历在物理内存中,可以提高效率
     */
    @Test
    public void test03() {
        //分配直接缓冲区
        ByteBuffer buf = ByteBuffer.allocateDirect(1024);
        System.out.println("判断是否为直接缓冲区"+ buf.isDirect());
    }

相关文章

  • Java NIO(3) - 直接与非直接缓冲区

    3.5 直接与非直接缓冲区 3.5.1 基本介绍 字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则...

  • 11.18

    Java 中,直接缓冲区与非直接缓冲器有什么区别?非直接缓冲区:通过allocate()分配缓冲区,将缓冲区建立在...

  • 3.NIO直接缓冲区与非直接缓冲区

    非直接缓冲区,缓冲区建立在JVM内存中,实际读写数据时,需要在OS和JVM之间进行数据拷贝,如下图: 为什么不直接...

  • JDK源码阅读:ByteBuffer

    Buffer是Java NIO中对于缓冲区的封装。在Java BIO中,所有的读写API,都是直接使用byte数组...

  • JDK源码阅读:ByteBuffer

    Buffer是Java NIO中对于缓冲区的封装。在Java BIO中,所有的读写API,都是直接使用byte数组...

  • Java 零拷贝 、缓冲区

    这两部分知识体系暂时没有联系起来,先记录以下 一、缓冲区——直接缓冲与非直接缓冲 1.1 非直接缓冲区(堆缓冲区)...

  • Java Nio 之Buffer

    Java Nio 系列Java Nio 之BufferJava Nio 之直接内存Java Nio 之高级搬砖工(...

  • Java Nio 之高级搬运工(FileChannel)二

    Java Nio 系列Java Nio 之BufferJava Nio 之直接内存Java Nio 之高级搬砖工(...

  • Java Nio 之高级搬砖工(FileChannel) 一

    Java Nio 系列Java Nio 之BufferJava Nio 之直接内存Java Nio 之高级搬砖工(...

  • Java Nio 之直接内存

    Java Nio 系列Java Nio 之BufferJava Nio 之直接内存Java Nio 之高级搬砖工(...

网友评论

      本文标题:Java NIO(3) - 直接与非直接缓冲区

      本文链接:https://www.haomeiwen.com/subject/qigbnhtx.html