前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NIO之缓冲区【直接和非直接缓冲区】

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

作者头像
用户4919348
发布2019-04-18 16:42:16
1.9K0
发布2019-04-18 16:42:16
举报
文章被收录于专栏:波波烤鸭波波烤鸭

直接与非直接缓冲区

  字节缓冲区跟其他缓冲区类型最明显的不同在于,它们可以成为通道所执行的 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()函数所创建的被包装的缓冲区总是非直接的。

代码语言:javascript
复制
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()方法,将文件直接映射到内存中创建
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 直接与非直接缓冲区
    • 直接缓冲区
      • 非直接缓冲区
        • 直接和非直接缓冲区解释
        相关产品与服务
        数据保险箱
        数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档