ByteBuf

【Netty4】netty ByteBuf(三)如何释放ByteBuf 谁来负责Release?在Netty里,因为Handler链的存在,ByteBuf经常要传递到下一个Hanlder去而不复还,所以规则变成了谁是最后使用者,谁负责释放。另外,更要注意的是各种异常情况,ByteBuf没有成功传递到下一个Hanlder,还在自己地界里的话,一定要进行释放。根据谁最后谁负责原则,每个Handler对消息可能有三种处理方式 对原消息不做处理,调用 ctx.fireCha... 阅读详情
用NIO时需要使用缓冲区,常用的缓冲区就是JDK NIO类库提供的java.nio.Buffer,而主要使用的是ByteBuffer。但是ByteBuffer也有局限性:
       1.ByteBuffer长度固定,一旦分配完成,它的容量就不能动态扩展和收缩,当需要编码的POJO对象大于ByteBuffer的容量时,会发送索引越界异常;
       2.ByteBuffer只有一个标识位置的指针position,读写的时候需要手工调用flip()和rewind()等,使用者必须小心谨慎地处理这些API,否则很容易导致程序处理失败;
       3.ByteBuffer的API功能有限,一些高级和实用的特性它不支持,需要使用者自己编程。

       为弥补这些不足,Netty提供了自己的ByteBuffer实现——ByteBuf。ByteBuf依然是个Byte数组的缓冲区,它的基本功能应该与JDK的ByteBuffer一致,提供以下几类基本功能:
       1. 7种Java基础类型、byte数组、ByteBuffer等的读写;
       2. 缓冲区自身的copy和slice等;
       3. 设置网络字节序;
       4. 构造缓冲区实例;
       5. 操作位置指针等方法;


       ByteBuf通过2个位置指针来协助缓冲区的读写操作,读操作使用readerIndex,写操作使用writerIndex。
       readerIndex和writerIndex的取值一开始都是0,随着数据的写入writerIndex会增加,读取数据会使readerIndex增加,但是它不会超过writerIndex。在读取之后,0~readerIndex的就被视为discard的,调用discardReadBytes方法,可以释放这部分空间,它的作用类似ByteBuffer的compact方法。ReaderIndex和writeIndex之间的数据是可读取的,等价于ByteBuffer的positon和limit之间的数据。writerIndex和capacity之间的空间是可写的,等价于ByteBuffer的limit和capacity之间的可用空间。
       由于写操作不修改readerIndex指针,读操作不修改writerIndex指针,因此读写之间不再需要调整位置指针,这极大地简化了缓冲区的读写操作,避免了由于遗漏或者不熟悉flip()操作导致的功能异常.

    

     

     

      

         

       需要注意的是,调用discardReadBytes会发生字节数组的内存复制,所以频繁调用将会导致性能下降。



       当对缓冲区进行读操作时,由于某些原因,可能需要对之前的操作进行回滚。读操作并不会改变缓冲区的内容,回滚操作主要就是重新设置索引信息。
       对于JDK的ByteBuffer,调用mark操作会将当前的位置指针备份到mark变量中,当调用reset操作之后,重新将指针的当前位置恢复为备份在mark中的值。
       Netty的ByteBuf也有类似的接口。因为ByteBuf有读索引和写索引,因此,它总共有4个相关的方法:markReaderIndex、resetReaderIndex、markWriterIndex、resetWriterIndex。


       通常情况下,当对ByteBuffer进行put操作的时候,如果缓冲区剩余可写空间不够,就会发生BufferOberflowException异常。为避免发生这个问题,通常在进行put操作的时候会对剩余可用空间进行校验,如果剩余空间不足,需要重新创建一个新的ByteBuffer,并将之前的ByteBuffer复制到新创建的ByteBuffer中,最后释放老的ByteBuffer。
       ByteBuf对write操作进行封装,由ByteBuf的write操作负责进行剩余可用空间的校验,如果可用缓冲区不足,ByteBuf会自动进行动态扩展。


ByteBuf的主要类继承关系:

       

从内存分配的角度看,ByteBuf可以分2类:
       1. 堆内存(HeapByteBuf)字节缓冲区:特点是内存的分配和回收速度快,可以被JVM自动回收;缺点就是如果进行Socket的I/O读写,需要额外做一次内存复制,将堆内存对应的缓冲区复制到内存Channel中,性能会有一定程度的下降;
       2. 直接内存(DirectByteBuf)字节缓冲区:非堆内存,它在堆外进行内存分配,相对于堆内存,它的分配和回收速度会慢一些,但是将它写入或者从Socket Channel中读取时,由于少了一次内存复制,速度比堆内存快。
       最佳实践:在I/O通信线程的读写缓冲区使用DirectByteBuf,后端业务消息的编解码模块使用HeapByteBuf。

从内存回收角度看,ByteBuf分2类:

       基于对象池的ByteBuf和普通ByteBuf。

       两者的主要区别就是基于对象池的ByteBuf可以重用ByteBuf对象,它自己维护一个内存池,可以循环利用创建的ByteBuf,提高内存使用效率,降低由于高负载导致的频繁GC。测试表明使用内存池后的Netty在高负载、大并发的冲击下内存和GC更加平稳。

27930-2015+充电协议解析 对2015+充电与2015充电进行硬件电路对比、通信协议对比和2015+通信协议解析。 阅读详情

相关推荐

远心F-theta镜ZEMAX设计

根据给出的F-theta镜的设计指标,对F-theta镜进行了具体的光学设计。从对F-theta镜设计思想的介绍出发,对选取的初始结构进行了优化设计,优化完成后,对所设计的F-theta镜进行了像质评价,通过点列图、场曲与畸变图、相对照度、能量集中度对所设计的F-theta镜进行了分析,最终,对F-theta镜的设计效果进行了验证。

hitliuyi17的博客 9424

Netty:ByteBuf写入数据、读出数据

Netty:ByteBuf写入数据、读出数据

听海边涛声 7825

国产射频直采收发器CX8242KA JESD204C调试

杭州诚芯公司的CX8242KA是国内开发的极少数支持JESD204C接口的高速AD、DA,Serdes具备支持接收和发送,并且速率可以到25Gbps,在国内属于领先水平。250M参考时钟输入,AD采样率2.5G,DA采样率10G,3收2发,主通道模式4,反馈通道模式1,基带采样率1250M,线速率20.625G,收发同时配置混频625M。CX8242KA的204C接口模式支持10种模式,在手册上都有说明。2、 支持TX信道编码,RX信道解码,提升健壮性。这里使用模式4,支持双通道模式,并且反馈开启。

RFSOC的博客 6219

Netty之ByteBuf

在使用NIO时需要使用缓冲区,常用的缓冲区就是JDK NIO类库提供的java.nio.Buffer,而主要使用的是ByteBuffer。但是ByteBuffer也有局限性: 1.ByteBuffer长度固定,一旦分配完成,它的容量就不能动态扩展和收缩,当需要编码的POJO对象大于ByteBuffer的容量时,会发送索引越界异常; 2.ByteBuf...

ZERO 3493

VBA常见错误 - “错误3706,未找到提供程序,该程序可能未正确安装”解决方法

1、问题描述 在利用VBA编程时,引用其它表格数据,出现以下问题: (1)运行“错误3706,未找到提供程序,该程序可能未正确安装”。 (2)引用数据失败 2、解决方法 下载“Access 2010 数据库引擎”,并安装即可。 https://www.microsoft.com/en-us/download/details.aspx?id=54920 AccessDatabaseEngine 2010 官方安装包,官网下载不了的可以来这里下载。(1)运行“错误3706,未找到提..

Nemuel的博客 3万+

激光雷达与相机融合(四)----基于激光雷达与相机的碰撞检测

在这一部分,基于前面的各个部分内容,将利用激光雷达和相机实现目标的检测分类及单目标跟踪,并对车辆前方的车辆目标计算相应的碰撞时间TTC。计算方法分别利用相机和雷达实现。 1.系统的总体架构: 2.TTC计算 简单介绍一下通过激光雷达和相机计算碰撞时间的原理: 利用激光雷达点计算碰撞时间:首先根据检测框聚类出前车目标的点,并过滤掉这些点中的离群点,然后找出这些点中相对于本车最近的点,基于前后两帧以及数据采集频率就可以求解出相对速度,然后用当前帧的距离除以速度得出当前的TTC。但该方法对最近点的选取稳定性不是

张飞飞的博客 3985

Bytebuf的读使用

Bytebuf的使用 首先,bytebuf有两种索引,分别是读索引(reader)和写索引(writer), 读索引<=写索引 reader是顺序读,表示从索引的位置按顺序往下读, 可以使用buf.readerindex(3)将读索引设置为3,然后接着顺序读。 同样可以使用get方法直接从指定位置顺序读: buf.getFloat(4):从索引为4的位置读一个Float的数(Float为4个字节,相当于把索引4-8的字节以float的形式读出来) bytebuf同样存在一个计数器,每次操作都会使计数器

guoqu1919的博客 2776

FreeRTOS深入教程(任务创建的深入和任务调度机制分析)

本篇文章将带大家深入学习任务的创建和分析任务调度的机制。本篇文章深入的讲解了任务创建的内部实现和任务调度的源代码分析和实现,学习这篇文章有助于更深入的学习FreeRTOS的源码。

m0_49476241的博客 6391

ByteBuf 读取字节数组数据

1.数据准备及代码 ByteBuf byteBuf = PooledByteBufAllocator.DEFAULT.directBuffer();//声明一个bytebuf 对象 byteBuf.writeByte(1);//第一位置存放数字1(占用1个字节) byteBuf.writeShort(0);//第二位置存放数字 0(占用2个字节) ,这里是打算做长度 String temp = "我是谁";//需要获取的数据 byteBuf.writeBytes(temp.getBytes());//

A_com_Z的博客 1万+

计算电磁学(三)有限差分方法

有限差分方法(FDM)是一种数值处理方法,通过将偏微分方程变换为一组代数方程,通过求解代数方程组来得到原边值问题的近似值。由于有限差分法非常简单,所以也特别的稳定高效。其中时域有限差分方法(FDTD)是电磁分析中的常用方法。在计算电磁学中,常用有限差分方法(finite difference equations)来替代微分方程。一个有限差分法通常包括三个步骤将求解域划分网格用有限差分方程逼近给定的微分方程求解在给定边界条件和初始状态下的方程常用的网格模型方阵斜方阵三角阵圆形阵。

CCC_B的博客 1639

实战案例四:Claude Code + Excel 技能处理表格数据

Excel 是商业世界中最通用的数据工具。无论是财务报表、销售数据还是项目计划,Excel 无处不在。本案例将展示如何利用 Claude Code 的 Excel 技能,自动化处理复杂的表格数据,告别繁琐的手工操作。

gaoxiang_120的专栏 475

ByteBuffer的使用

ByteBuffer的使用以及其中的方法

z318913的博客 3222

YOLOv12创新改进 | 全网独家创新篇、小目标检测改进 | AAAI 2025 | 引入HS-FPN中的HFP和SDP创新点,从频域增强小目标特征,淘汰FPN进行升级,助力YOLOv12有效涨点

本文提出了HS-FPN(高频和空间感知特征金字塔网络),通过HFP(高频感知)模块增强小目标特征,SDP(空间依赖感知)模块捕获像素间空间依赖关系。实验在AI-TOD等小目标数据集上验证了该方法的有效性,相比FPN显著提升检测性能。文章详细介绍了HS-FPN的网络结构、核心代码实现及在YOLOv12中的应用方法,并提供多种改进版本的yaml配置文件,为小目标检测任务提供了有效的解决方案。

Ai缝合怪、助力小伙伴高效发论文 336

【Netty4】netty ByteBuf (一)如何创建ByteBuf对象

有一点我们需要知道的是,ByteBuf的jar包,是可以单独使用的。比如某个项目中有一个场景,需要处理某个自定义的协议,那么我们在解析协议时,就可以将接收到的将字节内容写入一个ByteBuf,然后从ByteBuf中慢慢的将内容读取出来。下面让我们用一个例子简单的了解下ByteBuf的使用。 ByteBuf的创建 要想使用ByteBuf,首先肯定是要创建一个ByteBuf,更确切的说法就是要申请一块...

m0_45406092的博客 6124

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ByteBuf 详解

正如我们先前所指出的,。Java NIO 提供ByteBuffer作为字节的容器,但这个类是过于复杂,有点难以使用。Netty 中ByteBuffer的替代是ByteBuf,一个强大的实现,解决 JDK 的 API 的限制,以及为网络应用程序开发者一个更好的工具。但ByteBuf并不仅仅暴露操作一个字节序列的方法;这也是专门的 Netty 的的语义设计。在本章中,我们会说明相比于 JDK 的 API,ByteBuf所提供的卓越的功能和灵活性。这也将使我们能够更好地理解了 Netty 的数据处理。

m0_54901781的博客 1274

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Netty详解ByteBuf

目录 1 工作原理 2 基本使用 2.1 读取操作 2.2 写入操作 2.4 clear() 3 ByteBuf 使用模式 4 ByteBuf 的分配 5 ByteBuf的释放 5.1、⼿动释放 5.2 自动释放 5.2.1 TailHandler 5.2.2 SimpleChannelInboundHandler 5.2.3 HeadHandler 5.3 小结 1 工作原理 Java NIO 提供了ByteBuffer 作为它 的字节容器,但是这个类使⽤起来过于复杂,⽽且也有些繁琐。

赵广陆 4788

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

netty源码之ByteBuf详解

一、背景简介 ByteBuf,顾名思义,就是字节缓冲区,是Netty中非常重要的一个组件。熟悉jdk NIO的同学应该知道ByteBuffer,正是因为jdk原生ByteBuffer使用比较复杂,某些场景下性能不是太好,netty开发团队重新设计了ByteBuf用以替代原生ByteBuffer。 二、ByteBuf和ByteBuffer对比 下面用图示来展示ByteBuf和ByteBuffer工作原理: ①、ByteBuffer ByteBuffer依靠flip()来切换模式,在读模式下..

bobozai86的博客 9624

ByteBuf用法

JDK NIO之ByteBuffer的局限性如下: (1)长度固定,一旦分配完成,它的容量将不能动态扩展和收缩,而需要编码的POJO对象大雨ByteBuffer的容量时,会发生索引越界异常; (2)只有一个标识位置的指针position,读写的是偶需要搜公条用flip()和rewind()等,使用着必须小心的处理这些API,否则很容易导致程序越界异常; (3)ByteBuffer的API功能有限,...

a670941001的博客 8248

Netty之ByteBuf应用详解

掌握ByteBuf的常用方法。 了解池化的ByteBuf和非池化的ByteBuf的区别。 了解直接内存的ByteBuf和堆内存的ByteBuf的区别。 掌握对ByteBuf的内存释放方法。

前者已逝,后者未至。 2956

java 检查bytebuf长度_ByteBuf分析

1. 概念Java NIO API自带的缓冲区类功能相当有限,没有经过优化,使用JDK的ByteBuffer操作更复杂。故而Netty的作者Trustin Lee为了实现高效率的网络传输,重新造轮子,Netty中的ByteBuf实际上就相当于JDK中的ByteBuffer,其作用是在Netty中通过Channel传输数据。2. 优势可以自定义缓冲类型;通过内置的复合缓冲类型,实现透明的零拷贝(ze...

weixin_34237941的博客 2967

Netty之ByteBuf解读

netty中用于进行信息承载和交流的类叫做ByteBuf,从名字可以看出这是Byte的缓存区,是对字节数据的封装 粗略地可以从2个维度进行区分:内存分布和内存回收 按照内存分布维度:堆内存字节缓冲区、直接内存字节缓冲区 按照内存回收维度:基于对象池,普通缓冲区

一个菜鸡的博客 2524

netty byteBuf使用

package com.wang.wzrtunetty; import org.apache.cassandra.cli.CliParser.newColumnFamily_return; import com.wang.util.ByteUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufAllocatorMetricProvider;

fivestar2009的博客 3141

Netty 中的 ByteBuf 为什么会发生内存泄漏

该文所涉及的 netty 源码版本为 4.1.6。

黎明就要到来 1996

Netty中的ByteBuf详解

把书读薄(Netty In Action 第五章)ByteBuf是做什么用的?Netty中传递字节数据的容器。ByteBuf的使用模式有那些?使用模式描述  优点 劣势堆缓冲区数据存存储在JVM的堆空间中,又称为支撑数组,通过 hasArray 来判断是不是在堆缓冲区中 没使用池化情况下能提供快速的分配和释放 发送之前都会拷贝到直接缓冲区直接缓冲区 存储在物理内存中能获取超过jvm堆限制大小的空间...

爬蜥 7495

【netty】 ByteBuf的常用API总结

一、创建 1、池化创建 ByteBufAllocator 获取ByteBufAllocator Channel channel = ...;ByteBufAllocator allocator = channel.alloc(); //1....ChannelHandlerContext ctx = ...;ByteBufAllocator allocator2 = ctx.allo

qq_26680031的博客 1万+

Netty——ByteBuffer 与 ByteBuf

本文讲解了 ByteBuffer 和 ByteBuf 的基础功能,并对其进行比较。

qq_61350148的博客 1444
上一篇: Netty系列之Netty高性能之道
下一篇: Cassandra Commitlog
琅琊山二当家
博客等级 码龄18年 447粉丝 322原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值