Netty的零拷贝与ByteBuf

2023-11-19

Netty零拷贝

Netty的零拷贝完全是在用户态(Java 层面)的, 它的零拷贝更多的是偏向于 优化数据操作 这样的概念.而不是操作系统层面的用户态和核心态之间的数据拷贝。

Netty 的 零拷贝体现在如下几个个方面:

Netty 提供了 CompositeByteBuf 类, 它可以将多个 ByteBuf 合并为一个逻辑上的 ByteBuf, 避免了各个 ByteBuf 之间的拷贝.
通过 wrap 操作, 我们可以将 byte[] 数组、ByteBuf、ByteBuffer等包装成一个 Netty ByteBuf 对象, 进而避免了拷贝操作.
ByteBuf 支持 slice 操作, 因此可以将 ByteBuf分解为多个共享同一个存储区域的 ByteBuf, 避免了内存的拷贝.
通过 FileRegion 包装的FileChannel.tranferTo 实现文件传输, 可以直接将文件缓冲区的数据发送到目标 Channel, 避免了传统通过循环 write 方式导致的内存拷贝问题.

ButeBuffer

Java NIO提供ByteBuffer作为字节容器,但只有一个位置指针用于处理读写操作,每次读写时候都需要额外调用flip()和clear()方法,否则功能将会出错。查看ByteBuffer源码如下:
在这里插入图片描述
mark:调用mark()方法的话,mark值将存储当前position的值,等下次调用reset()方法时,会设定position的值为之前的标记值;
position:是下一个要被读写的元素的数组下标索引,该值会随get()和put()的调用自动更新;
limit:是缓冲区中第一个不能读写的元素的数组下标索引,也可以认为是缓冲区中实际元素的数量;
capacity:是缓冲区能够容纳元素的最大数量,这个值在缓冲区创建时被设定,而且不能够改变

四者关系如下:

0 <=mark <= position <= limit <= capacity

ByteBuffer bf = ByteBuffer.allocate(10);

创建初始化缓冲区,可以看到初始值position=0,而limit=capacity=初始化长度
在这里插入图片描述
调用flit刷新缓冲区为读模式

  bf.flip()

缓冲区有两种模式,分别是写模式和读模式,这两种模式通过使用flip方法进行模式。如上将缓冲区切换为读模式,则position变成了初值位置0,而limit变成了写模式下position位置。
在这里插入图片描述

 读取缓冲区中到内容:get()
 调用mark(),标记position位置  
 标记完position后,继续读取缓冲区区内容
 使用reset()方法可以使position回到mark存储到位置    
 调用compact()方法,清空已读取数据空间,进行数据到重新填充
 使用clear清空缓冲区

ByteBuf详解

从结构上来说,ByteBuf 由一串字节数组构成。数组中每个字节用来存放信息。
ByteBuf是Netty框架封装的数据缓冲区,区别于ByteBuffer需要有position、limit、flip等属性和操作来控制byteBuffer数据读写,Bytebuf通过两个位置指针来协助缓冲区的读写操作,分别是readIndex和writerIndex。

当从 ByteBuf 读取时,它的 readerIndex(读索引)将会根据读取的字节数递增。 同样,当写 ByteBuf 时,它的
writerIndex 也会根据写入的字节数进行递增

在这里插入图片描述
需要注意的是极限的情况是 readerIndex 刚好读到了 writerIndex 写入的地方。
如果 readerIndex 超过了 writerIndex 的时候,Netty 会抛出 IndexOutOf-BoundsException 异常。

初始化ByteBuf时,readIndex和writerIndex取值一开始是0,随着数据的写入writerIndex会增加,读取数据会使readIndex增加,但不会超过writerIndex。在读取之后0-readIndex被视为discard,调用discardReadBytes方法,释放这部分空间,作用类似于ByteBuffer的compact方法,移除无用数据,实现缓冲区的重复使用

初始化ByteBuf         ByteBuf bf= Unpooled.buffer(10,100)     
读取数据 read
写入数据 write
discardReadBytes 释放已经读取过的数据空间

相比较,Netty中的ByteBuf使用更加方便,还提供了查找操作(indexOf(int fromindex,int toIndex,byte value)、bytesBefore(Byte value))、数据复制(Derived buffers)、ByteBuffer和ByteBuf互相转化等功能更强大的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Netty的零拷贝与ByteBuf 的相关文章

  • 如果计算的哈希码超过整数最大限制,会发生什么?

    这是 Java HashTable 类的 hashCode 实现 如果哈希表中的元素数量很大并且哈希码超过 INTEGER MAX LIMIT 2 147 483 648 到 2 147 483 647 该怎么办 我假设 hashCodes
  • 为什么 Java 中需要 String[] args?

    我知道 String args 是作为参数传递到 main 的字符串数组 java Print Hello World class Print public static void main String args System out p
  • 使用 Firebase Java API 检索/格式化数据的最佳方式

    我在用着Firebase用于数据存储Android项目 并使用Firebase Java API来处理数据 不过 我不确定我是否尽可能高效地完成此操作 并且我希望获得一些有关检索和格式化数据的最佳实践的建议 我的Firebase存储库看起来
  • Java 密钥库 - 以编程方式从密钥库文件中选择要使用的证书

    我有一个 java 密钥库文件 其中包含多个客户端证书 我希望在 Java 应用程序中仅选择其中一个证书来连接到服务 有没有一种简单的方法可以做到这一点 到目前为止 我找到解决方案的唯一方法是使用原始密钥库文件中的客户端证书详细信息 通过其
  • 规范路径和绝对路径有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 中的 getPath getAbsolutePath 和 getCanonicalPath 有什么区别 https stackoverflow com questions 1099300 w
  • ActiveMQ 桥连接器到 WebSphereMQ 而不使用 XML 配置

    我想在嵌入式代理中创建一个代理来代理 ActiveMQ 和 WebSphere MQ 之间的连接 我知道 activemq 中存在网络连接器来执行此操作 代理到代理 但我不知道如何配置它以连接到 WebSphere MQ 在网络上进行搜索时
  • 是否可以将 BitmapDescriptor 转换为 Bitmap?

    我需要将 BitmapDescriptor 转换为 Bitmap 我可以使用以下代码将位图转换为 BitmapDescriptor BitmapDescriptor bd BitmapDescriptorFactory fromBitmap
  • 原型组件的 Spring 事件处理

    假设我有两个组件 X 和 Y 其中 X 是单例 而 Y 不是 当我发布XUpdateEvent时 没有问题 我可以捕获该事件 但是 对于 YUpdateEvent 我无法捕获事件 Spring 为每个触发的事件创建新实例 而不是使用已经创建
  • 如何在Netbeans中自定义jTable标题列字体大小?

    我尝试改变jtable标题字体大小Netbeans 但还不能 无论如何 表行字体大小已成功更改 这是我使用的方法 更改后的输出 问题 标题字体大小未更改 但我也想改变这一点 所以请帮助我该怎么做 一种方法是使用UIManager并替换默认的
  • 为什么在java中加载JNI是在静态初始化程序中完成的?

    在许多使用 JNI 的示例中 我看到类似以下内容 class SampleClass static System loadLibrary somelib 这种特殊语法的目的是什么 为什么使用这个 而不仅仅是在类构造函数或类似的东西中 我想你
  • Java 线程 JavaDoc

    我编写了一个只能在特定线程上调用的方法 是否应该将标准注释或注释添加到方法的 javadoc 中来表示这一点 不知道有任何这样的标准注释 Java 并发实践 http www javaconcurrencyinpractice com 在第
  • 自 Java 7 以来 HttpServer 延迟 1 秒

    我们正在使用内部HttpServer项目中的类 用于通过 HTTP 在客户端和服务器之间交换数据 当我们切换到 Java 7 时 我们意识到结果交付存在延迟 我们可以将问题简化为以下示例 Class EchoServer创建上下文 echo
  • ImageIO read() 和 write() 操作后 GIF 图像变得错误

    我有这个代码 它只是读取 GIF 文件 用背景重新绘制它 然后输出到新的 GIF 文件 问题是结果文件变得奇怪 我不知道为什么它的质量变得很差 JPG 文件不会出现此问题 如何修复它 import java awt Color import
  • android 中的 lang.NumberFormatException

    我有以下代码 除了在后台线程中从数据库读取一些值并使用这些值之外什么也不做 我使用 jar 绘制折线图 对于我用于每个数组值的折线图 问题是第三个我传递给绘制 LineChart 的构造函数的参数是 float float viteza S
  • RecyclerView:禁用焦点变化引起的滚动

    TL DR我有一个RecyclerView of EditTexts 当用户注意力集中时EditText 1并点击EditText 2 我想EditText 2获得焦点 但我不想要ReyclerView滚动 我怎样才能实现这个目标 我正在尝
  • 通过命令行参数更改默认的 ant 目标

    最近我被分配了一个任务 让ant能够为不同的环境构建war包 除了一项功能外 我几乎完成了 蚂蚁接受一个env参数类似 Denv DEV 并使用不同的配置文件来制作war包 但默认目标是start它将构建 部署并启动 tomcat 我不希望
  • Tomcat 与 Weblogic JNDI 查找

    我们使用的 Weblogic 服务器已配置为允许 JNDI 数据源名称 例如 appds 对于开发 本地主机 我们可能会运行 Tomcat 并且在 server xml 的 部分中声明时 Tomcat 会将 JNDI 数据源挂在 JNDI
  • 删除子类中的注释?

    我有一个子类 需要一个注释 在删除的父类中声明 做这个的最好方式是什么 public class Parent MyAnnoation String foobar public class Child extends Parent here
  • 为什么永久代空间不断增长?

    我读过几篇文章 我理解以下内容 如果我错了 请纠正我和 或编辑问题 java堆是这样分段的 年轻代 创建的对象放在这里 这部分被频繁且廉价地垃圾收集 老一代 在年轻代的垃圾收集中幸存下来的对象会移到此处 该区域的垃圾收集频率较低 并且使用对
  • Java 中的下载管理器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要通过 FTP HTTP 从 Java 获取几个大文件 几个演出 有现成的库 java 命令行工具

随机推荐

  • java双人对弈五子棋源码_java swing 双人五子棋源代码

    import java awt Color import java awt Font import java awt Graphics import java awt Toolkit import java awt event MouseE
  • C++ 类中的static成员的初始化和特点

    C 类中的static成员的初始化和特点 在C 的类中有些成员变量初始化和一般数据类型的成员变量有所不同 以下测试编译环境为 g v Using built in specs COLLECT GCC g Target x86 64 linu
  • 删除排序数组的重复项(给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间)

    给定一个排序数组 你需要在原地删除重复出现的元素 使得每个元素只出现一次 返回移除后数组的新长度 不要使用额外的数组空间 你必须在原地修改输入数组并在使用 O 1 额外空间的条件下完成 示例 1 给定数组 nums 1 1 2 函数应该返回
  • 第八章 聊聊区块链的几个数字

    第八章 聊聊区块链的几个数字 1 概述 2 2100W 3 每个区块10分钟 4 挖矿奖励4年递减1次 5 区块确认6次永久生效 6 51 算力攻击 6 1 币安黑客事件 参考资料 1 概述 在学习区块链过程中 会发现一些数字 心里不断问自
  • 使用MVC框架简单搭建一个数据库-后台-服务器Web项目

    在对Tomcat技术基本了解之后 用MVC框架简单搭建一个数据库 后台 服务器Web项目 MVC框架简介 MVC 是一种使用 MVC Model View Controller 模型 视图 控制器 设计创建 Web 应用程序的模式 Mode
  • 安全之公开密钥基本知识

    文件加密的基本知识 1 公开密钥密码 传统密码的缺点 1 收发双方持有相同密钥 密钥分配困难 KE KD K E K D 2 不能方便的实现数字签名 应用不方便 数字签名概念下面有 历史 公开密钥密码又称为双钥密码或非对称密码 是1976年
  • 企业网站建设方案书

    一 网站建设目标 1 1背景分析 现在网络的发展已呈现商业化 全民化 全球化的趋势 目前 几乎世界上所有的公司都在利用网络传递商业信息 进行商业活动 从宣传企业 发布广告 招聘雇员 传递商业文件乃至拓展市场 网上销售等 无所不能 如今网络已
  • iPhone Safari下iframe不显示滚动条无法滚动的解决方法

    div class dataTables wrapper style height 300px div
  • Go渗透测试笔记(二)---TCP,扫描器和代理

    Go渗透测试笔记 二 TCP 扫描器和代理 0x00 前言 TCP是面向连接协议的主要标准 也是现代网络的基础 作为攻击者 我们应当了解TCP的工作原理 并且能够开发可用的TCP结构体 以便可以识别 打开 关闭 的端口 找出错误的结果 如误
  • TCP/IP协议栈及网络基础,协议栈原理及实现

    1 TCP IP协议栈及网络基础 推荐这个在B站几千观看的视频讲解 底层原理到徒手实现 TCP IP网络协议栈 tcp协议栈 如何实现 C C Linux服务器开发高级架构学习视频点击 C C Linux服务器开发高级架构师 Linux后台
  • 正则表达式工具类

    在实际开发中总会使用到正则表达式匹配数据 我也是在后面查看了一些资料 下面写一个常用的正则表达式匹配集合 正则匹配模式 表示匹配字符串的开始位置 例外 用在中括号中 时 可以理解为取反 表示不匹配括号中字符串 表示匹配字符串的结束位置 表示
  • 量化交易动了谁的奶酪

    最近关于量化交易的政策讨论频出 在内容上 主要是限制其高频交易和某些可能对市场产生负面影响的行为 具体来说 中国证券监督管理委员会和上海证券交易所等机构都出台了相关政策 对量化交易的频率 规模 风险控制等方面进行了限制 这些政策的出台主要是
  • python--模块导入

    目录 模块简介 模块导入的两种方式 方式一 import 方式二 from import 模块简介 1 什么是模块 模块就是一系列功能的结合体 可以直接使用 2 为什么要用模块 极大地提升开发效率 拿来主义 gt gt gt 站在巨人的肩膀
  • docker部署redis集群实现动态扩缩容

    目录 思考 分布式存储的解决方案 哈希取余分区 一致性哈希算法分区 哈希槽分区 采用哈希槽分区 部署三主三从 docker 准备工作 创建3主3从redis实例 进入容器中 构建主从关系 主从容错切换迁移 主从扩容 主从缩容 思考 假如现有
  • canvas实战之酷炫背景动画(一)

    系列文章 canvas实战之酷炫背景动画 一 canvas实战之酷炫背景动画 二 canvas实战之酷炫背景动画 三 canvas实战之酷炫背景动画 四 canvas实战之酷炫背景动画 五 canvas实战之酷炫背景动画 六 canvas实
  • 09-java多线程

    多线程相关概念 并发和并行 并行 在同一时刻 有多个指令在多个CPU上同时执行 并发 在同一时刻 有多个指令在单个CPU上交替执行 进程和线程 进程 是正在运行的程序 独立性 进程是一个能独立运行的基本单位 同时也是系统分配资源和调度的独立
  • 分布式一致性协议Raft原理与实例

    thesecretlivesofdat 分布式一致性协议Raft原理与实例 标签 分布式算法 2015 09 30 20 43 3519人阅读 评论 15 收藏 举报 分类 Hadoop 7 版权声明 本文为博主原创文章 未经博主允许不得转
  • 客户端存储技术

    Cookie Cookie 是一种非常基础的客户端存储方式 得到广泛的支持 创建多个 cookie 的方法 document cookie name Jim document cookie age 18 当创建多个 cookie 时只能像这
  • chrome浏览器安装redux-devtools调试工具

    chrome浏览器安装redux devtools调试工具 1 点击进入https www chromefor com 2 在搜索框搜索redux 3 找到最新版本 Redux DevTools v2 17 0 进行下载 4 选择下载线路
  • Netty的零拷贝与ByteBuf

    Netty零拷贝 Netty的零拷贝完全是在用户态 Java 层面 的 它的零拷贝更多的是偏向于 优化数据操作 这样的概念 而不是操作系统层面的用户态和核心态之间的数据拷贝 Netty 的 零拷贝体现在如下几个个方面 Netty 提供了 C