ByteBuf继承体系和每个类的作用

netty5.0中bytebuf的方法 1. 概念 Java NIO API自带的缓冲区类功能相当有限,没有经过优化,使用JDK的ByteBuffer操作更复杂。故而Netty的作者Trustin Lee为了实现高效率的网络传输,重新造轮子,Netty中的ByteBuf实际上就相当于JDK中的ByteBuffer,其作用是在Netty中通过Channel传输数据。 2. 优势 可以自定义缓冲类型; 通过内置的复合缓冲类型,实现透明的零拷贝(zero-copy); 不需要调用flip()来切换读/写模式; 读取和写入索引分开; 方法链 阅读详情

ByteBuf 是 Netty 中用于数据传输的核心组件,它是一个功能强大、灵活且高性能的字节容器。理解其继承体系对于深入掌握 Netty 的内存管理和数据处理至关重要。

io.netty.buffer.ByteBuf 继承体系

ByteBuf 的继承体系主要围绕其接口定义和不同内存管理策略的实现类展开。核心结构如下:

现在我们来详细说明每个主要接口和类的作用:
在这里插入图片描述

1. io.netty.util.ReferenceCounted

  • 作用:这是一个接口,定义了引用计数(Reference Counting)机制。ByteBuf 实现了这个接口,表明它的生命周期是通过引用计数来管理的。
  • 核心方法:
    • refCnt(): 返回当前引用计数。
    • retain(): 增加引用计数。每调用一次,引用计数加 1。
    • release(): 减少引用计数。每调用一次,引用计数减 1。当引用计数降到 0 时,内存会被回收。
  • 重要性:引用计数是 Netty 内存管理的核心。它解决了传统 JVM 垃圾回收器无法有效回收直接内存(Direct Buffer)的问题,并能更精确地控制堆内存的生命周期,避免内存泄漏。

2. io.netty.buffer.ByteBuf

  • 作用:Netty 中所有字节容器的抽象接口。它定义了读写字节数据、管理读写索引、以及容量调整等一系列操作。ByteBuf 是 Netty 中最核心的数据结构之一,取代了 Java NIO 中的 ByteBuffer,提供了更易用、更强大的功能。
  • 特性:
    • 读写指针分离:一个 readerIndex 用于读,一个 writerIndex 用于写。这比 ByteBuffer 的单一 position 指针更灵活,无需在读写模式间切换。
    • 容量可扩展:可以在需要时自动扩容。
    • 支持池化:通过 ByteBufAllocator 可以实现内存的复用,减少垃圾回收和内存分配的开销。
    • 支持零拷贝:可以通过 slice()、duplicate()、compositeBuffer() 等方法创建共享底层数据的 ByteBuf,避免数据复制。
    • 字节序可配置:支持大端序 (Big Endian) 和小端序 (Little Endian)。
  • 核心概念:
    • capacity(): 当前 ByteBuf 的最大容量,即实际分配的内存大小。
    • maxCapacity(): ByteBuf 可以扩容到的最大容量。
    • readerIndex(): 当前读指针的位置。
    • writerIndex(): 当前写指针的位置。
    • isReadable(): 是否有可读字节。
    • isWritable(): 是否有可写空间。

3. io.netty.buffer.AbstractByteBuf

  • 作用:ByteBuf 接口的抽象实现基类,提供了 ByteBuf 大部分通用方法的骨架实现。具体的内存分配和底层的读写操作(如 _getByte, _setByte 等抽象方法)留给子类实现。
  • 特点:
    • 实现了 ReferenceCounted 接口。
    • 维护了 readerIndex、writerIndex、capacity 和 maxCapacity 等核心状态变量。
    • 提供了大量便利的读写方法(如 readByte(), writeInt(), writeByte(), getBytes(), setBytes() 等)。

4. io.netty.buffer.AbstractDerivedByteBuf

  • 作用:这是所有派生型 ByteBuf 的抽象基类。派生型 ByteBuf 的特点是它们不拥有独立的底层内存,而是共享一个已存在的 ByteBuf 的内容。它们有自己独立的读写索引和标记索引。
  • 重要性:实现了零拷贝操作,避免了不必要的数据复制,提高了性能。

5. 派生型 ByteBuf 的具体实现:

  • io.netty.buffer.DuplicatedByteBuf
    • 作用:创建一个现有 ByteBuf 的完整副本,但它与原 ByteBuf 共享底层内存内容。
    • 特点:拥有独立的 readerIndex、writerIndex 和标记索引。这意味着你可以在 DuplicatedByteBuf 上自由读写,而不会影响原 ByteBuf 的索引,但内容的修改会同时反映在两者上。其 capacity() 总是等于原 ByteBuf 的 capacity()。
    • 创建方式:byteBuf.duplicate()。
  • io.netty.buffer.SlicedByteBuf
    • 作用:创建一个现有 ByteBuf 的部分视图。它共享原 ByteBuf 的部分底层内存内容。
    • 特点:拥有独立的 readerIndex、writerIndex 和标记索引。其 capacity() 等于切片的大小。内容的修改会反映在两者上。
    • 创建方式:byteBuf.slice(index, length) 或 byteBuf.slice() (从当前读索引到写索引的切片)。
  • io.netty.buffer.SwappedByteBuf
    • 作用:创建一个现有 ByteBuf 的字节序(Endianness)反转视图。它共享原 ByteBuf 的底层内存。
    • 特点:当你在 SwappedByteBuf 上读写多字节数据(如 int, long)时,会自动进行字节序转换。
    • 创建方式:byteBuf.order(ByteOrder.LITTLE_ENDIAN) 或 byteBuf.order(ByteOrder.BIG_ENDIAN)。

6. 具体内存分配策略的 ByteBuf 实现:

这些类通常不会直接通过 new 关键字创建,而是通过 ByteBufAllocator 来获取。

  • io.netty.buffer.PooledByteBuf
    • 作用:这是池化 ByteBuf 的抽象基类。它表示从内存池(如 Netty 的 Jemalloc 风格的内存分配器)中分配的 ByteBuf。
    • 特点:池化内存可以显著减少内存分配和垃圾回收的开销,尤其适用于高并发场景。PooledByteBuf 在被释放(引用计数为 0)时,其底层内存不会立即被 JVM 回收,而是返回到内存池中,供后续的分配复用。
    • 子类:
      • io.netty.buffer.PooledHeapByteBuf:从 JVM 堆内存池中分配的 ByteBuf。
      • io.netty.buffer.PooledDirectByteBuf:从直接内存池中分配的 ByteBuf。直接内存(堆外内存)绕过了 JVM 堆,I/O 性能更高,但回收需要手动或依赖 Netty 的引用计数。
  • io.netty.buffer.UnpooledByteBuf
    • 作用:这是非池化 ByteBuf 的抽象基类。它表示每次分配都会向操作系统或 JVM 申请新的内存。
    • 特点:每次使用都会进行内存分配和回收,可能导致更高的 GC 压力和内存碎片,但对于少量或生命周期不确定的 ByteBuf 可能更简单。
    • 子类:
      • io.netty.buffer.UnpooledHeapByteBuf:从 JVM 堆内存中非池化分配的 ByteBuf。
      • io.netty.buffer.UnpooledDirectByteBuf:从直接内存中非池化分配的 ByteBuf。

7. io.netty.buffer.CompositeByteBuf

  • 作用:一个特殊的 ByteBuf 实现,它是一个虚拟的 ByteBuf,由多个真实的 ByteBuf 组合而成,但不进行数据拷贝。
  • 特点:
    • 实现了零拷贝:当需要将多个 ByteBuf 组合成一个逻辑上的 ByteBuf 进行处理时,CompositeByteBuf 避免了将所有数据复制到一个新的 ByteBuf 中,从而节省了内存和 CPU 开销。
    • 读写操作会委托给其内部的各个组件 ByteBuf。
    • 常用于 HTTP 消息的 header 和 body 分开传输,但逻辑上需要作为一个完整消息处理的场景。
  • 创建方式:ByteBufAllocator.compositeBuffer()。

8. io.netty.buffer.ByteBufHolder (接口)

  • 作用:一个接口,用于表示一个对象持有一个 ByteBuf。这个接口的目的是为了方便地管理那些除了 ByteBuf 数据本身还包含额外元数据(如 HTTP 头、消息类型等)的消息对象。
  • 核心方法:
    • content(): 返回所持有的 ByteBuf。
    • copy(): 深度复制,复制ByteBuf及其所有元数据。
    • replace(ByteBuf content): 替换持有的ByteBuf。
    • retain()/release(): 实现引用计数,通常会委托给内部的 ByteBuf。
  • 重要性:在 Netty 的编解码器中广泛使用,例如 FullHttpRequest、FullHttpResponse 等,它们都实现了 ByteBufHolder,允许它们在持有数据 ByteBuf 的同时,还包含其他协议相关的字段。

总结 ByteBuf 体系的关键点:

  • 读写分离的索引:这是 ByteBuf 相较于 ByteBuffer 的一大优势。
  • 引用计数:Netty 内存管理的核心,有效控制了堆外内存和池化内存的生命周期。
  • 内存池化:PooledByteBuf 大幅提升了性能和内存利用率,减少了 GC 压力。
  • 零拷贝特性:DuplicatedByteBuf、SlicedByteBuf 和 CompositeByteBuf 实现了多种形式的零拷贝,避免了不必要的数据复制。
  • 直接内存(Direct Buffer):对于 I/O 密集型应用,直接内存通常性能更优,因为它避免了 JVM 堆和操作系统内核之间的两次拷贝。
  • 可扩展性与灵活性:ByteBuf 提供了一致的 API,无论底层是堆内存还是直接内存,池化还是非池化,都能够以相同的方式操作。

理解这些类及其作用,有助于你在 Netty 应用中做出正确的内存管理决策,编写出高性能、内存高效的网络服务。

95-36-200-ChannelHandler-系统Channel-LoggingHandler 1. 概述 ​ 日志处理器LoggingHandler是使用Netty进行开发时的好帮手,它可以对入站\出站事件进行日志记录,从而方便我们进行问题排查。 2. 继承体系 3.类签名 @Sharable @SuppressWarnings({ "StringConcatenationInsideStringBufferAppend", "StringBufferReplaceableByString" }) public class LoggingHandler extends ChannelDuplex. 阅读详情

相关推荐

物联网技术-第2章-物联网技术架构

• 物联网具有很强的异构性• 为实现异构设备之间的互联、互通与互操作,物联网需要以一个开放的分层的可扩展的为框架。

m0_73804764的博客 2976

Netty-8 ByteBuf及相关辅助类

一、ByteBuf功能说明 (一)ByteBuffer 当我们进行数据传输的时候,往往用到数据缓冲区,常用的缓冲区是JDK NIO提供的java.nio.Buffer。 在NIO中,7种基本数据类型(boolean除外)都有自己的缓冲区实现。对于NIO编程而言,主要使用的是ByteBuffer。 然而,ByteBuffer有自己的一些缺陷: 长度固定。一旦分配完成,容量不能进行扩展和收缩; 只有...

mail_liuxing的专栏 417

别再只盯着CXL协议了,聊聊CXL.mem里那个能动态调优内存性能的‘QoS遥测’到底怎么用

本文深入解析CXL.mem协议中的QoS遥测功能,探讨如何通过DevLoad指标动态调优内存性能。文章详细介绍了QoS遥测的核心机制、多QoS类别设备的实战配置,以及AI训练、金融交易和视频处理场景中的优化案例,帮助数据中心实现高效内存资源管理。

weixin_33725722的博客 436

Netty之认识ByteBuf

目录 ByteBuf的结构 常见API read write get、set mark、reset ByteBuf的分类 继承体系图 AbstractByteBuf Pooled与Unpooled Unsafe与非Unsafe Heap与Direct ByteBuf是Netty底层直接与数据打交道的一层抽象。ByteBuf作为数据流的载体,提供了一些列简单易用的API来操...

学无止境 1402

从FedAvg到实战:手把手教你用PyTorch复现联邦学习经典论文实验(MNIST/CIFAR-10)

本文详细介绍了如何使用PyTorch复现联邦学习经典算法FedAvg在MNIST和CIFAR-10数据集上的实验。从环境搭建、数据非IID划分到模型实现和参数聚合,手把手教你掌握联邦学习的核心技术与实战技巧,帮助开发者和研究人员快速实现隐私保护的分布式机器学习方案。

weixin_29053695的博客 252

深入探索前端调试神器vConsole

vConsole作为一款前端调试神器,为前端开发者提供了一个便捷的调试解决方案。通过本文的介绍和示例,相信你已经对vConsole有了更深入的了解。然而,vConsole的功能远不止于此,它还有许多高级用法和技巧等待你去发掘。讨论:你在前端开发中是如何使用vConsole的?你有没有发现vConsole的一些隐藏功能或技巧?欢迎在评论区分享你的经验和见解!💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 8519

Netty 权威指南笔记(五):ByteBuf 源码解读

Java 本身提供了 ByteBuffer 类,为什么 Netty 还要搞一个 ByteBuf 类呢?因为 ByteBuffer 类有着许多缺点: 1. ByteBuffer 长度固定,无法动态伸缩。 2. ByteBuffer 只有一个位置指针 position,读写的时候需要手工调用 flip 和 rewind 方法进行模式转换,操作繁琐,容易出错。 3. 功能太少,缺少一些高级特性。

albon arith 1815

CocosCreator视频播放黑屏?手把手教你封装VideoPlayer组件解决Web环境问题

本文针对Cocos Creator在Web环境下视频播放黑屏等常见问题,提供了一套工程化的VideoPlayer组件封装解决方案。文章深入剖析了浏览器自动播放策略、DOM样式隔离等核心挑战,并手把手教你实现一个健壮的管理器,涵盖兼容性处理、性能优化与内存管理,确保视频播放稳定流畅。

plum99的博客 598

Netty从0到1系列之ByteBuf【上】

Netty的ByteBuf是一种高性能的字节数据容器,相比Java NIO的ByteBuffer具有明显优势。它采用双指针设计(readerIndex和writerIndex),实现读写分离而无需flip操作,支持动态扩容和内存池化,提供堆内存和直接内存两种存储方式。ByteBuf架构包含HeapByteBuf、DirectByteBuf等实现类,可满足不同场景需求。其核心特点是容量自动扩展、引用计数管理以及零拷贝支持,显著提升了网络编程中的数据处理效率。

编程技术圈 1528

ISP工程师实战笔记:5种Demosaic算法优缺点对比(含Hamilton/DFPD代码片段)

本文从ISP工程师实战角度,深入对比了五种经典Demosaic算法的优缺点。文章详细剖析了双线性插值、Hamilton、DFPD、DLMMSE和GBTF等算法的核心思想、实现差异与性能表现,并提供了Hamilton和DFPD算法的关键代码片段。重点探讨了在图像信号处理流水线中,如何根据画质、计算复杂度和功耗等工程约束进行算法选型与权衡。

weixin_42527589的博客 248

EMC诊断技术及电磁兼容理论设计

本文深入探讨了EMC诊断技术,重点在于滤波篇,详细讲解了EMI滤波器的设计、选型、测试及应用注意事项。内容涵盖噪声限值法规、滤波器的法规依据、插入损耗测试以及滤波电容的高频特性。同时,还阐述了噪声源的近场与远场特性,如何快速定位和抑制噪声。通过实例分析,提供了滤波器件和辐射噪声抑制器件的选型策略。

让你爱上电路设计 2161

深入研究Netty框架之ByteBuf类继承结构

ByteBuf类继承关系图如下: ReferenceCounted:对象引用计数器,初始化ReferenceCounted对象时,引用数量refCnt为1,调用retain()可增加refCnt,release()用于减少refCnt。refCnt为1时,说明对象实际不可达,release()方法将立即调用deallocate()释放对象。如果refCnt为0,说明对象被错误的引用。在Abs

sigh667的专栏 1420

DISM进行系统修复,进度条卡在63.2%的解决方法

一时用不了软件,安装修复的时候也出现问题 DISM一直卡在63.2%,等了好久时间,直接强制退出寻找最终的解决方案

码农研究僧的博客 1万+

深入研究Netty框架之ByteBuf家族

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34122604的博客 217

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Netty 的 ByteBuf 是如何支持 堆内存非池化 实现的

Netty的ByteBuf是如何支持堆内存非池化实现的 ByteBuffer 从实现方式上分成 HeapByteBuffer 和 DirectByteBuffer 两种内存实现方式, HeapByteBuffer 底层使用 byte 数组存储数据, DirectByteBuffer 底层使用 unsafe 操作直接内存 Java 原生的 Buffer 有三种不同的分类方式:按数据类型、按内存实现方式、按读写方式,可以分成不同的 Buffer。 那么,今天,我想问: 1 Netty 中的 ByteBuf 有没

炫的博客 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Netty源码之ByteBuf(4.1.44)

Netty源码之ByteBuf(4.1.44) Netty 抛弃了 Java NIO 的 ByteBuffer,因为它功能有限且使用过于复杂。于是乎,Netty 自己弄出了一个类似 ByteBuffer 的数据容器,称之为 ByteBuf,并且提供很多非常酷的特性: 容量可按需动态扩展。 读写采用不同的指针,并随意切换,不需要用户额外调用 flip() 切换读写模式。 通过内置的复合缓冲类型实现零拷贝技术。 支持引用计数。 支持缓存池。 类型丰富,支持堆外内存和堆内内存。 继承关系图 图中所框选的是在

ClarenceZero的博客 685

假人有限元模型

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

Netty学习笔记之ByteBuf概览

一、ByteBuf 下图是ByteBuf的继承体系: 1、分类 1)从内存分配角度看,可分为两种: (1)堆内存字节缓冲区:如上图中带有Heap的类,它们的特点是直接在堆中分配内存,分配和回收快,但缺点是在网络通信读写中,需额外做一次内存分配, (2)直接内存缓冲区:使用直接内存...

125

Netty中的内存分配分析

1.ByteBuf的继承类图 1.1 AbstractBytebuf的实现 int readerIndex; int writerIndex; private int markedReaderIndex; private int markedWriterIndex; private int maxCapacity; 主要实现了index的实现,定义了_getByte和_setByte由其子类实现 1.2 ByteBuf分类 可以分为3类 Pooled和Unpooled分类 区别:pooled 是从已经分

diligence-zpf 836

Netty-9 Channel和UnSafe

一、Channel简介 Channel是Netty的网络抽象类,聚合了很多的功能,包括网络读、写,客户端发起连接,主动关闭连接,链路关闭,获取通讯双方的网络地址等。也包括了Netty框架自身的一些功能,如获取该Channel的EventLoop,获取缓冲分配器ByteBufferAllocator和pipeline等等。 二、Channel功能介绍 以上是Channel接口提供的一些方法,很多比...

mail_liuxing的专栏 411

Netty中的装饰者模式

装饰者的应用 所谓装饰者,说白了,目的就是对现有的对象进行增强,装饰者设计模式最大的优点就是,它在扩展类原有功能的基础上还避免的类爆炸的情况 Netty中的装饰者模式的应用 ByteBuf是netty中重要的数据容器类,我们看它是如何设计的,如下图 我们可以看到,ByteBuf的直接实现类有五个,忽略WrappedByteBuf这个类,其实直接实现类有四个,为什么要忽略掉Wrappe...

weixin_30887919的博客 207

java netty之ByteToMessageDecoder

在上面的一篇文章中,有说明ByteToMessageDecoder是怎么使用的,那么这一篇就来讲讲它是怎么实现的。。 首先还是来看一下它的继承体系: 它直接继承自ChannelInboundByteHandlerAdapter类型,至于说这个类型的介绍,在前面的文章中就已经有了说明,无非是实现了那些inboundhandler的方法,不过实现的都非常的粗糙,另外一些hand

u010395804的专栏 2646

深入剖析 Netty 的核心组件

本篇文章对 Netty 中开发者最经常打交道的五个组件:ByteBuf,Channel,pipeline,ChannelHandler、EventLoop 做了详细的说明...

形势所逼,不进则退 270

java netty之ChannelInboundByteHandlerAdapter

这篇文章分析另外一个表重要比较基础的handler : ChannelInboundByteHandlerAdapter 当我们编写的服务器程序需要直接处理byte的时候,可以直接扩展它来实现inboundhandler,用于处理传送过来的byte数据。。。例如举一个典型的用法:public class MyChannelHandler extends ChannelInboundByteHan

fjs的专栏 2887

【Netty源码解读和权威指南】第81篇:Netty Codec框架源码解析——编解码器是如何设计的

本文深入解析Netty Codec框架的编解码器设计,主要内容包括:1) Codec继承体系,涵盖ByteToMessageDecoder、MessageToMessageDecoder等核心类;2) ByteToMessageDecoder的核心机制,重点分析cumulation累积缓冲区实现;3) callDecode循环解码流程,包括数据消费与产出逻辑;4) cumulation的两种模式(MERGE复制合并与COMPOSITE零拷贝组合)。文章还总结了Netty编解码框架的关键机制,如数据累积、循环

xyghehehehe的专栏 321
上一篇: ByteBuf的扩容机制
下一篇: Netty中CompositeByteBuf的使用
Jooou
博客等级 码龄9年 226粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值