专栏首页波波烤鸭NIO之缓冲区【直接和非直接缓冲区】

NIO之缓冲区【直接和非直接缓冲区】

直接与非直接缓冲区

  字节缓冲区跟其他缓冲区类型最明显的不同在于,它们可以成为通道所执行的 I/O 的源头和/或目标。其实发现通道只接收ByteBuffer作为参数这个将Channel的时候会发现。

类型

优点

缺点

直接缓冲区

在虚拟机内存外,开辟的内存,IO操作直接进行,没有再次复制

创建和销毁开销大

非直接缓冲区

在虚拟机内存中创建,易回收

但占用虚拟机内存开销,处理中有复制过程。

直接缓冲区

  直接缓存区是在虚拟机内存外,开辟的内存,IO操作直接进行,不再对其进行复制,但创建和销毁开销大。

非直接缓冲区

  非直接缓存区在虚拟机内存中创建,易回收,但占用虚拟机内存开销,处理中有复制过程。

直接和非直接缓冲区解释

  操作系统在内存区域中进行I/O操作,这些内存区域,就操作系统方面而言,是相连的字节序列。所以,只有字节缓冲区有资格参与I/O操作。操作系统会直接存取进程——在本例中是JVM进程的内存空间,以传输数据。这也意味着I/O操作的目标内存区域必须是连续的字节序列。在JVM中,字节数组可能不会在内存中连续存储,或者无用存储单元收集可能随时对其进行移动。在Java中,数组是对象,而数据存储在对象中的方式在不同的JVM实现中都各有不同。出于这一原因,引入了直接缓冲区的概念。

  直接字节缓冲区通常是I/O操作最好的选择。在设计方面,它们支持JVM可用的最高效I/O机制。非直接字节缓冲区可以被传递给通道,但是这样可能导致性能损耗。通常非直接缓冲不可能成为一个本地I/O操作的目标。如果向一个通道中传递一个非直接ByteBuffer对象用于写入,通道可能会在每次调用中隐含地进行下面的操作:

  1. 创建一个临时的直接ByteBuffer对象。
  2. 将非直接缓冲区的内容复制到临时缓冲中。
  3. 使用临时缓冲区执行低层次I/O操作。
  4. 临时缓冲区对象离开作用域,并最终成为被回收的无用数据。

  直接缓冲区是I/O的最佳选择,但可能比创建非直接缓冲区要花费更高的成本。直接缓冲区使用的内存是通过调用本地操作系统方面的代码分配的,绕过了标准JVM堆栈。建立和销毁直接缓冲区会明显比具有堆栈的缓冲区更加破费,这取决于主操作系统以及JVM实现。直接缓冲区的内存区域不受无用存储单元收集支配,因为它们位于标准JVM堆栈之外。

  直接ByteBuffer是通过调用ByteBuffer.allocateDirect()函数产生的,注意用一个wrap()函数所创建的被包装的缓冲区总是非直接的。

public abstract class ByteBuffer extends Buffer implements Comparable {
    // This is a partial API listing
    public static ByteBuffer allocate(int capacity)
    public static ByteBuffer allocateDirect(int capacity)
    public abstract boolean isDirect();
}

使用直接缓冲区有两种方式:

  1. 缓冲区创建的时候分配的是直接缓冲区
  2. 在FileChannel上调用map()方法,将文件直接映射到内存中创建

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NIO之缓冲区【复制缓冲区】

      复制一个缓冲区会创建一个新的 Buffer 对象,但并不复制数据。原始缓冲区和副本都会操作同样的数据元素。我们将以 CharBuffer 为例来演示,但同样...

    用户4919348
  • Netty之JavaNIO编程模型介绍01

      Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API。从 JDK1.4 开始,Java 提供了一系列改进的输入/...

    用户4919348
  • java虚拟机运行时数据区介绍

      最近打算将java虚拟机的相关知识点整理出来。本文先介绍下java虚拟机运行时分配的各个区域的作用

    用户4919348
  • JAVA NIO Buffer

    基于存储的硬件设备操控的是固定大小的数据块儿,用户请求的是任意大小的或非对齐的数据块儿。

    WindWant
  • 史上最强Java NIO入门:担心从入门到放弃的,请读这篇!

    本文原题“《NIO 入门》,作者为“Gregory M. Travis”,他是《JDK 1.4 Tutorial》等书籍的作者。

    JackJiang
  • 史上最强Java NIO入门:担心从入门到放弃的,请读这篇!

    本文原题“《NIO 入门》,作者为“Gregory M. Travis”,他是《JDK 1.4 Tutorial》等书籍的作者。

    JackJiang
  • 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜

    前两天发的这篇文章:《IntelliJ IDEA 2020.2重磅发布!全面支持Github PR。真香版本?》中介绍到:尽管Java 15的发布将在9月进行,...

    Guide哥
  • NIO效率高的原理之零拷贝与直接内存映射

    在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,点击查看。

    全菜工程师小辉
  • 企业网络中的安全设计

    作为保护网络秩序的重要一环,网络安全从来都是网络管理人员日常工作中的一大重任。不出问题则以,出问题都是大问题。

    释然
  • 1-10落败,5分钟崩盘!星际2职业高手史上首次被AI击溃,AlphaStar一战成名

    DeepMind开发的全新AI程序AlphaStar,在今天凌晨的《星际争霸2》人机大战直播节目中,轻松战胜2018 WCS Circuit排名13、神族最强1...

    量子位

扫码关注云+社区

领取腾讯云代金券