当前位置: 首页 > news >正文

Netty 必知必会(三)—— ByteBuf

  • Netty ByteBuf工作原理,和NIO里ByteBuffer区别?

Java NIO 提供了ByteBuffer 作为它 的字节容器,但是这个类使⽤起来过于复杂,⽽且也有些繁琐。

ByteBuf是Netty框架中的一个关键类,专门设计来处理字节数据,旨在替代Java标准NIO库中的ByteBuffer。

相较于ByteBuffer,ByteBuf引入了更高效的数据操作方式和更丰富的API支持。其核心优势在于支持自动读写切换、内存池化以及零拷贝技术,这些特性共同作用使得ByteBuf在数据处理方面的性能大大超越了传统的ByteBuffer。

一、自动读写切换

1.NIO 里的 ByteBuffer

对于 Java NIO 的 Buffer,其有几个重要的属性:positionlimitcapacity,其中position代表的是下一个读或写的位置,limit是可被读或写的最高位,而capacity就是 Buffer 的容量了,之所以要在读和写切换的时候进行手动操作(clear()flip()),主要是因为在 NIO 中,positionlimit在读的时候代表的是下一个需读的位和可读的最高位,但是在写的时候又代表下一个需写的位和可写的最高位(其实就是capacity),换句话说这两个变量在不同的操作场景下有不同的含义,对应值也不同,所以需要在读写切换的时候进行手动操作

2.Netty里的ByteBuf

而 Netty 的 ByteBuf 则对这一点做了改进,其针对读写操作分别增加上了readerIndex(原来的position)writerIndex(对应 NIO 中的 limit,使用的时候不需要考虑读写转换。

  • 读的时候就变动readerIndex的值,此时可读的最高位其实就是writerIndex
  • 写的时候就变动writerIndex的值,此时可写的最高位就是capacity

说白了就是两个变量分别管理读和写的操作位,互不冲突,也就不存在读写切换的时候手动操作。


 二、内存池化

1.给 ByteBuf 分配内存

在 Netty 中,ByteBuf 用来作为数据的容器,是一种会被频繁创建和销毁的对象。

分配 ByteBuf 需要的内存空间有三种方式

  • 堆缓冲区(HeapByteBuf)

  1. 优点:内存的分配和回收速度⽐较快,可以被JVM⾃动回收。由于在堆上被 JVM 管理,在不被使⽤时可以快速释放。可以通过ByteBuf.array() 来获取 byte[] 数据。

  2. 缺点:如果进⾏socket的IO读写,需要额外做⼀次内存复制,将堆内存对应的缓冲区复制到内核Channel中,性能会有⼀定程度的下降。

  • 直接缓冲区(DirectByteBuf),堆外内存。

  1. 优点:将它写⼊或从Socket Channel中读取时,由于减少了⼀次内存拷⻉,速度⽐堆内存块。

  2. 缺点:相⽐堆内存,它的分配和回收速度会慢⼀些。

  • 复合缓冲区(CompsiteByteBuf),顾名思义就是将上述两类缓冲区聚合在⼀起。Netty 可以将堆缓冲区和直接缓冲区的数据放在⼀起,让使⽤更加⽅便。

但抛开哪个代价高哪个代价低不说,光是频繁创建和频繁销毁这一点,就已奠定了效率不高的基调。Netty 为了解决这个问题,引入了池化技术,池化技术的思想不复杂,和线程池思想类似,说白了就是对一些可重用的对象用完不回收,后面需要再次使用,以减少创建和销毁对象带来的资源损耗。

2.引用计数 来管理 ByteBuf

引用计数就是实现池化的关键技术点

(不过并非只有池化的 ByteBuf 才有引用计数,非池化的也会有引用)。

  • ByteBuf实现了ReferenceCounted接口,表明该类是一个引用计数管理对象。
  • 每一个引用计数对象,都维护了一个自身的引用计数,通过refCnt()方法可以得到当前的引用计数。
  • 当第一次被创建时,引用计数为 1,调用retain()方法会增加自身的引用计数值。
  • 调用release()方法减少当前的引用计数值,如果引用计数值为 0,当前的 ByteBuf 自动释放,返回值为true

引用计数机制有效预防内存泄漏,确保及时回收不再使用的内存资源。 

3.Netty 实现内存池化

Netty 提供了两种 ByteBufAllocator 的实现,分别是:

  • PooledByteBufAllocator,实现了 ByteBuf 的对象的池化,提⾼性能减少并最⼤限度地减少内存碎⽚。
  • UnpooledByteBufAllocator,没有实现对象的池化,每次会⽣成新的对象实例。 

如何释放?

  • 手动释放:调用release()方法
  • 自动释放:略

释放后如何?

  • 池化的 ByteBuf,那么就会重新进池子,以待重用;
  • 非池化的 ByteBuf,则销毁底层的字节数组引用或者释放对应的堆外内存。

池化技术通过重用已有的ByteBuf实例,减少了频繁的内存分配与回收操作,显著提升了性能。


三、零拷贝技术

Netty必知必会(一)——零拷贝-CSDN博客

  • slice():创建一个与原始ByteBuf共享数据的新视图,但拥有独立的读写索引。
  • duplicate():创建一个完整的ByteBuf副本,共享数据内容但维护一套独立的索引。
  • compositeByteBuf():可以将多个ByteBuf合并为一个逻辑上的ByteBuf,实现数据的逻辑组合而非物理合并。

四、参考

一文读懂网络框架Netty_文化 & 方法_蔡昱星_InfoQ精选文章

 Netty详解ByteBuf_netty bytebuf-CSDN博客

 Netty之ByteBuf详解与实战-CSDN博客

相关文章:

Netty 必知必会(三)—— ByteBuf

Netty ByteBuf工作原理,和NIO里ByteBuffer区别? Java NIO 提供了ByteBuffer 作为它 的字节容器,但是这个类使⽤起来过于复杂,⽽且也有些繁琐。 ByteBuf是Netty框架中的一个关键类,专门设计来处理字节数据,…...

芋道以开源之名行下作之事 恬不知耻 标榜自己开源 公开源码+sql 不用再加入知识星球

资源 链接: https://pan.baidu.com/s/1TeuxbAUfLQ5_BqMBF1kniQ?pwdcqud 提 取码: cqud 依次为后端、补充版的sql、前端 此文档内安装部署等一应俱全...

wordpress中,wp_posts 文章的状态 有哪些,分别对应什么数值

在WordPress中,wp_posts 表存储了网站上的所有内容,包括文章(posts)、页面(pages)、自定义文章类型(custom post types)等。这个表有一个名为 post_status 的字段,用于标…...

输入成绩问题(c语言)

1.问题:期中考试开始了,大家想要取得好成绩,争夺前五名,从键盘输入n个学生成绩(不超过40个),输出每组的前五名的成绩 两行,第一行输入一个整数,表示n个学生(…...

基于域名+基于ip+基于端口的虚拟主机+上线商务系统

一、回顾 1.jdk环境 tomcat服务器需要jdk环境 版本对应 ​ tomcat9>jdk1.8 配置系统变量JAVA_HOME sed -i $aexport JAVA_HOME/usr/local/jdk22/ /etc/profile sed -i $aexport PATH$JAVA_HOME/bin:$PATH /etc/profile ​ source /etc/profile ​ java -version java…...

vue每次路由跳转前将页面滚动到顶部

在Vue.js应用中,特别是使用Vue Router进行页面路由管理时,router.beforeEach是一个非常有用的导航守卫(Navigation Guard)。它允许你在路由跳转之前执行一些逻辑,比如权限验证、页面跳转前的数据加载、滚动位置重置等。…...

【Qt】QDateTimeEdit

在Qt中,QDateEdit是用于选择日期的微调框,QTimeEdit是用于选择小时和分钟的微调框 QDateTimeEdit则是基于QDateEdit和QTimeEdit的组合控件,能够同时显示日期和时间,并允许用户以交互方式编辑日期 常用属性 属性说明dateTime时间…...

Redis和Mysql如何保持数据一致性

一般情况下,Redis是用来实现应用和数据库之间读操作得缓存层,主要目的是减少数据库IO,还可以提升数据的IO性能。 当应用程序需要去读取某个数据时,会首先尝试去Redis里面加载,如果命中就直接返回,如果没有…...

Java中Optional相关

Java中Optional相关 orElse 提供默认值以确保不会返回 null。 适用于默认情况下的备选值或简单计算结果。 // 如果 optionalName 为空&#xff0c;返回 "Unknown" Optional<String> optionalName Optional.empty(); String result optionalName.orElse(&q…...

AI在HR候选人关系管理中的革新应用

一、引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;其在人力资源管理&#xff08;HR&#xff09;领域的应用也日益广泛。特别是在候选人关系管理方面&#xff0c;AI技术不仅提高了管理效率&#xff0c;还使得候选人体验得到了极大的改善。本文将深入分…...

HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字+烟花特效)

利用HTMLCSSJavaScript制作了一个简单的七夕表白网页&#xff1a; 这是一个简单的表白功能&#xff0c;可以用于小哥哥小姐姐在情人节向心爱的人表白使用点击信封中间的爱心&#xff0c;会出现一封信由信封向外展开&#xff0c;与此同时会有烟花绽放&#xff0c;并且自动播放背…...

【Python机器学习系列】一文教你实现决策树模型可视化(案例+源码)

这是我的第335篇原创文章。 一、引言 决策树是一个有监督分类模型&#xff0c;本质是选择一个最大信息增益的特征值进行输的分割&#xff0c;直到达到结束条件或叶子节点纯度达到阈值。根据分割指标和分割方法&#xff0c;可分为&#xff1a;ID3、C4.5、CART算法。每一种颜色代…...

如何在Python中使用网页抓取API获得Google搜索结果

SERP是搜索引擎结果页的缩写&#xff0c;它是你在百度、谷歌、Bing等搜索引擎中提交查询后所得到的页面。搜索引擎需要给所有页面做排序&#xff0c;把最能解决我们需求的页面展示给我们&#xff0c;企业会非常关注结果页的排序&#xff0c;也就是本企业内容的自然排名情况。手…...

Postman高频面试题及答案汇总(接口测试必备)

Postman在软件测试的面试中&#xff0c;可以说是必考题了&#xff0c;既然是高频考题&#xff0c;当然得为粉丝宝宝们整理一波题库喽~ 一、Postman在工作中使用流程是什么样的&#xff1f; 二、你使用过Postman的哪些功能&#xff1f; 三、Postman如何管理测试环境&#xff…...

JavaEE 初阶(13)——多线程11之“定时器”

目录 一. 什么是“定时器” 二. 标准库的定时器 三. 定时器的实现 MyTimer 3.1 分析思路 1. 创建执行任务的类。 2. 管理任务 3. 执行任务 3.2 线程安全问题 四. 拓展 一. 什么是“定时器” 定时器是软件开发中的一个重要组件&#xff0c;类似于一个“闹钟”&#xff0…...

2024最新全开源付费进群系统源码二开修复版 支持易支付

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 全开源付费进群系统源码&#xff0c;开源无加密无授权&#xff0c;优化电脑端访问布局&#xff0c;支持dai理&#xff0c;对接易支付通道&#xff0c;dai理可以配置自己易支付接口&am…...

【奥顺苹果CMS二开泛目录4.X版】PHP站群程序新增首页堆砌关键词新增四套seo模板

演示站&#xff08;赠送四套模板&#xff09;&#xff1a; https://macfan.qdwantong.com https://macfan2.qdwantong.com https://macfan3.qdwantong.com https://macfan4.qdwantong.com 4.X版程序特色功能&#xff1a; 后台除了可以设置干扰码、转码、插入符号和拼音这…...

day06 项目实践:router,axios

vue组件的生命周期钩子 今天几乎没有讲什么新内容&#xff0c;就是一起做项目&#xff0c;只有一个小小的知识点&#xff0c;就是关于vue组件的生命周期钩子&#xff0c;其中最重要的四个函数—— beforeCreate()&#xff1a;组件创建之间执行 created()&#xff1a;组件创建…...

⌈ 传知代码 ⌋ 基于矩阵乘积态的生成模型

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...

软件测试必备技能

在软件测试领域&#xff0c;以下是一些必备的技能和能力&#xff0c;可以帮助你成为一名优秀的软件测试工程师&#xff1a; 1. 测试基础知识&#xff1a; 熟悉软件测试的基本概念、原则和流程&#xff0c;包括不同类型的测试&#xff08;如单元测试、集成测试、系统测试&#…...

TL3568编译uboot报错

编译uboot前&#xff0c;需要 ① sudo apt-get install device-tree-compiler 否则会报“ERROR: No dtc” ② sudo apt install python 装个Python2&#xff0c;否则会报“ERROR: No python2”...

qiankun 微前端 隔离子应用样式,解决 ant-design-vue 子应用样式污染问题(已落地)

样式冲突产生原因 先分析乾坤qiankun 构建之后&#xff0c;会根据你的配置 给每个子应用生成一个id&#xff0c; 当加载到对应子应用的时候&#xff0c;就把内容放到对应的id 标签里去&#xff0c; 这样能有效的隔离 js 代码&#xff0c;但是样式是加载在全局的 所以 当两个子…...

一个前后端分离架构的低代码开发平台,支持微服务架构,支持开发SAAS项目(附源码)

前言 在当前的企业软件开发领域&#xff0c;开发者常常面临着代码重复性高、开发效率低、项目周期长等挑战。现有的软件解-决方案往往难以满足快速变化的市场需求&#xff0c;特别是在SAAS项目、企业信息管理系统&#xff08;MIS&#xff09;、内部办公系统&#xff08;OA&…...

whisper+whisperx ASR加对齐

忘了怎么安装了&#xff0c;这里记录一下整理出来的类&#xff0c;不过这个 from chj.comm.pic import *import json import whisper import whisperx import gcclass Warp_whisper:def __init__(self, language"zh", device"cuda", compute_type"fl…...

【已解决】YOLOv8加载模型报错:super().__init__(torch._C.PyTorchFileReader(name_or_buffer))

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…...

中国象棋 纯网页前端 演示与下载

https://andi.cn/app/chess/...

学习大数据DAY29 python基础语法2

目录 调试---debug tuple&#xff08;元组&#xff09; set&#xff08;集合&#xff09; dict&#xff08;字典&#xff09; 转换 推导式 上机练习 3 函数 参数 不定长参数 值传递与引用传递 局部和全局变量 上机练习 4 调试---debug 1. 先设置断点 2. 点击调试…...

自动化测试常用函数(Java方向)

目录 一、元素的定位 1.1 cssSelector 1.2 xpath 1.2.1 获取HTML页面所有的节点 1.2.2 获取HTML页面指定的节点 1.2.3 获取⼀个节点中的直接子节点 1.2.4 获取⼀个节点的父节点 1.2.5 实现节点属性的匹配 1.2.6 使用指定索引的方式获取对应的节点内容 二、操作测试对…...

申瓯通信设备有限公司在线录音管理系统(复现过程)

漏洞简介 申瓯通信设备有限公司在线录音管理系统 index.php接口处存在任意文件读取漏洞&#xff0c;恶意攻击者可能利用该漏洞读取服务器上的敏感文件&#xff0c;例如客户记录、财务数据或源代码&#xff0c;导致数据泄露 一.复现过程 fofa搜索语句:title"在线录音管…...

【C++进阶学习】第十一弹——C++11(上)——右值引用和移动语义

前言&#xff1a; 前面我们已经将C的重点语法讲的大差不差了&#xff0c;但是在C11版本之后&#xff0c;又出来了很多新的语法&#xff0c;其中有一些作用还是非常大的&#xff0c;今天我们就先来学习其中一个很重要的点——右值引用以及它所扩展的移动定义 目录 一、左值引用和…...

小蜜蜂网站建设/合肥百度推广优化排名

题目 题目&#xff1a; 1.分别使用*/运算&#xff0c;结果都是8 2.把你的幸运数字存储在一个变量中&#xff0c;再用这个变量说出你的心愿。并打印出来 3.添加注释 以下是本篇文章正文内容&#xff0c;欢迎朋友们进行指正&#xff0c;一起探讨&#xff0c;共同进步。——来自考…...

网络营销类型有哪些/seo推广策略

#define UsartRxBuffAddressArmEntry 0X20001000 #define UsartRxBuffSize 0x400 unsigned char USART_RX_BUF[UsartRxBuffSize ] __ attribute __((at(UsartBuffAddressArmEntry ))); //将串口接收的数据定位存放到RAM中地址为0X20001000–0x200013FF 中&#xff1b; #defin…...

游戏网站app/石家庄网站建设方案推广

解决方法如下&#xff1a; 1>、进入超级用户模式。也就是输入"su -",系统会让你输入超级用户密码&#xff0c;输入密码后就进入了超级用户模式。 2>、添加文件的写权限。也就是输入命令"chmod uw /etc/sudoers"。 3>、编辑/etc/sudoers文件…...

政府网站建设方面存在的问题及对策/代写文章

俗话说&#xff1a;大公司做人&#xff0c;小公司做事&#xff0c;当你的能力、格局等方方面面还不够“尖锐”、专业到可以独掌一面的时候&#xff0c;扎实沉在公司里&#xff0c;学习、沉淀、韬光养晦才是最靠谱的选择&#xff0c; 当然还有最主要的原因-养活自己。可惜的是&a…...

唐山做网站公司哪家好/优化官网咨询

http://www.cnblogs.com/littlemonk/p/5500801.html这篇文章主要介绍了Angularjs中UI Router全攻略&#xff0c;涉及到angularjs ui router的基本用法&#xff0c;需要的朋友参考下吧首先给大家介绍angular-ui-router的基本用法。 如何引用依赖angular-ui-router angular.modul…...

永久免费网站建商城/百度广告点击软件

ifconfig中lo、eth0、br0、wlan0接口 ifconfig中loeth0br0wlan0接口 lo 回环接口eth0 以太网接口br0 网桥接口wlan0 无线接口lo 回环接口 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 一般回环接口的ip v4地址为:127.0.0.1&#xff0c;子网掩码&#xf…...