Netty提供了一个更好的实现:ByteBuf。 ByteBuf的API Netty为数据处理提供的API通过抽象类ByteBuf和接口ByteBufHolder暴露出来。...Netty的ByteBuf实现达到并超过这些需求。下面了解一下如何通过索引来简化对获取它持有数据的操作。 工作原理 ByteBuf维护两个不同的索引:读索引和写索引。...当你从ByteBuf中读,它的readerIndex增加了读取的字节数;同理,当你向ByteBuf中写,writerIndex增加。...handleArray(array, 0, array.length); Netty通过CompositeByteBuf来优化socket的IO操作,尽可能的消除JDK buffer实现中的性能和内存使用中的不足...尽管这些优化被封装到Netty的核心代码中,但你应该意识到这些优化的影响。 字节级别的操作 除了基本的读写操作,ByteBuf提供了大量的修改它数据的方法。下面我们会讨论最重要的一些。
继承ByteBuf,ByteBuf中的一些公共属性和方法会在AbstractByteBuf中实现。...Memory Arena指内存中的一大块连续的区域,PoolArena是Netty的内存池实现类。...Netty中,Chunk中的Page被构造成一棵二叉树。 每一个Page可以成为一个节点,第一层的Page节点用来分配所有Page需要的内存。...PoolSubpage 对于小于一个Page的内存,Netty在Page中完成分配。每个Page会被切分成大小相等的多个存储块,存储块的大小由第一次申请的内存块大小决定。...比如,Http协议的请求消息和应答消息都可以携带消息体,这个消息体在Netty中就是ByteBuf对象。
ByteBuf是做什么用的?Netty中传递字节数据的容器。 ByteBuf的使用模式有那些?...使用模式 描述 优点 劣势 堆缓冲区 数据存存储在JVM的堆空间中,又称为支撑数组,通过 hasArray 来判断是不是在堆缓冲区中 没使用池化情况下能提供快速的分配和释放 发送之前都会拷贝到直接缓冲区...直接缓冲区 存储在物理内存中 能获取超过jvm堆限制大小的空间写入channel比堆缓冲区更快 释放和分配空间昂贵(使用系统的方法)操作时需要复制一次到堆上 复合缓冲 单个缓冲区合并多个缓冲区表示 操作多个更方便...另外参数中包含ByteBuf且没有目标索引的[比如 readBytes(ByteBuf dest) writeBytes(ByteBuf dest)],会影响对应的readerIndex(写的方法影响readerIndex...ByteBufAllocator:使用ChannelHandleContext(Channel每个都有不同的实例,或者ChannelHandler获取)能够拿到它的引用,Netty从4.1.x开始默认使用池化
一、功能原理 ByteBuf是一个byte存放的缓冲区。 ByteBuf通过两个位置的指针来协助缓冲区的读写操作,读操作使用readIndex,写操作使用writeIndex。...(HeapByteBuf)字节缓冲区:特点是内存的分配和回收速度快,可以被JVM自动回收;缺点就是如果进行Socket的IO读写,需要额外做一次内存复制,将堆内存对应的缓冲区复制到内核Channel中,...性能会有一定程度的下降 2、直接内存(DirectByteBuf) 字节缓冲区:非堆内存,它在对外进行内存分配,相比于堆内存,它的分配和回收速度会慢一些,但是将它写入或者从Socket Channel中读取时...,由于少一次内存复制,速度比堆内存快 Netty的最佳实践是在I/O通信线程的读写缓冲区使用DirectByteBuf,后端业务消息的编解码模块使用HeapByteBuf,这样组合可以达到性能最优。...ByteBuf的四种声明方式 ByteBuf heapBuffer = Unpooled.buffer(); System.out.println(heapBuffer); ByteBuf directBuffer
ByteBuf详解 netty提供了一个io.netty.buffer的包,该包里面定义了各种类型的ByteBuf和其衍生的类型。...netty Buffer的基础是ByteBuf类,这是一个抽象类,其他的Buffer类基本上都是由该类衍生而得的,这个类也定义了netty整体Buffer的基调。...注意的是,虽然JDK中有自带的ByteBuffer类,但是netty中的 ByteBuf 算是对Byte Buffer的重新实现。他们没有关联关系。...在前面小节中,我们讲到ByteBuf是一个ReferenceCounted,这个特征在衍生buf中就用到了。...总结 ByteBuf是netty的底层基础,是传输数据的承载对象,深入理解ByteBuf就可以搞懂netty的设计思想,非常不错。
Netty - ByteBuf 1.1 原生的ByteBuffer Java NIO的ByteBuffer被称为字节缓冲区。...此类针对字节缓冲区定义了以下六类操作: 读写单个字节的绝对和相对 get 和 put 方法; 将此缓冲区的连续字节序列传输到数组中的相对批量 get 方法; 将 byte 数组或其他字节缓冲区中的连续字节序列传输到此缓冲区的相对批量...也就是说,在每次调用基础操作系统的一个本机 I/O 操作之前(或之后),虚拟机都会尽量避免将缓冲区的内容复制到中间缓冲区中(或从中间缓冲区中复制内容)。...将非直接缓冲区的内容复制到临时缓冲中。 使用临时缓冲区执行低层次I/O操作。 临时缓冲区对象离开作用域,并最终成为被回收的无用数据。...在这个空间范围内,不论是在ByteBuffer类的对象中还是在作为视图的新缓冲区中,对数据所做的修改,对另一个来说都是可见的。除了数据本身之外,两者的读写位置、读写限制和标记位置等都是相互独立的。
Netty的ByteBuf实现满足并超越了这些需求。 ByteBuf结构 ByteBuf维护了两个不同的索引:一个是用于读取,一个用于写入。...当你从ByteBuf读取是,它的 readerIndex将会被递增已经被读取的字节数。同样地,当你写入ByteBuf时,它的 witerIndex也会被递增。 作为一个容器,源码中的如下。...initialCapacity,maxCapacity) : 发现分配 Unpooled、Unsafe、Heap内存,其实是分配了一个byte数组,并保存在 UnpooledHeapByteBuf#array成员变量中。...直接通过下标获取byte数组中的byte @Override public byte getByte(int index) { ensureAccessible();...; } DefaultHandle newHandle() { //实例化一个处理器并并且初四话成员变量,该成员变量stack从threalocal中初始化
每个缓存对象, 队列中缓存的ByteBuf大小是固定的, netty将每种缓冲区类型分成了不同长度规格, 而每个缓存中的队列缓存的ByteBuf的长度, 都是同一个规格的长度, 而缓冲区数组的长度, 就是规格的数量...Netty内存分配流程 摘自于xingdong大佬的文章: https://www.jianshu.com/p/1ce3bc2d7c5e 首先举一个生活中例子。...在 netty 类比以上的物流系统中 同城仓库相当于 PoolThreadCache —— 线程独有的内存仓库; 区域仓库相当于PoolArean —— 几个线程共享的内存仓库; 全国仓库相当于全局变量指向的内存仓库...在 netty 中,整块批发内存,之后或拆开零售,或整块出售。整块批发的内存叫做 chunk,对于小件和大件订单,则进一步拆成 run。...netty中整个内存分配可以用以下图来展示。 源码比较复杂有兴趣的还是你自己照着这图去看比较好点。 ?
Netty - ByteBuf (2) 1.2. netty的ByteBuf 1.2.1....ByteBuf结构 Bytebuf是netty中的ByteBuffer,结构上通过两个位置指针协助缓冲区的读写操作。...写溢出问题 ByteBuf对于写操作进行了封装,防止写入应该被释放的ByteBuf或者写入时空间不够,我们查看下主要类的代码: AbstractByteBuf.java: public ByteBuf...Mark和Reset 和ByteBuffer中的Mark还有Reset类似,mark记录当前标记,reset回滚到之前标记的位置 AbstractByteBuffer.java public ByteBuf...Clear 操作 也和ByteBuffer中的clear()类似: AbstractByteBuffer.java public ByteBuf clear() { readerIndex
这个优化实现在了Netty的核心代码中,也就是说它不会被暴露,但是我们需要意识到这个造成的影响。...并不会将ByteBuf1和ByteBuf2中的数据拷贝一份过来,而是共享了ByteBuf1、ByteBuf2数据。...Unpooled类使ByteBuf能在在非网络项目中有效使用,这使得项目能从高性能可扩展的buffer API中获益并且不需要其他的Netty组件。...后记 本文主要对Netty的ByteBuf进行了详细的介绍。Bytebuf是Netty中存储数据的容器,相比于JDK 的ByteBuffer又进行了进一步的优化和加强。...后期我们会通过源码解析的方式进一步的了解ByteBuf在Netty中的使用。 若文章有任何错误,望大家不吝指教:) 参考 《Netty in action》
Netty - ByteBuf (3) 1.3 ByteBuf相关实现源码 相关类继承关系 ? 其中,我们从AbstractByteBuf和他的子类开始分析,其他的多为衍生工具类。...AbstractByteBuf 上一节主要的源代码都是AbstractByteBuf中的,这里不再赘述其中的方法,其中的域如下所示: ?...其中有一个ResourceLeakDetector,用了装饰器模式实现,用于检测内存泄露(没有成对调用ByteBuf的retain和relaease方法,导致ByteBuf没有被正常释放),这里先跳过。...该类是用来执行较低级别的操作的,比如获取某个属性在内存中的位置等等,还有一些底层的IO操作。...Java 8可能会将Unsafe剔除,netty通过设置“io.netty.noUnsafe”这个系统属性为true或false来开启或关闭使用Unsafe。
概述 Netty 中的 ByteBuf 和 NIO 中的 ByteBuffer 的区别。 1、Netty 中的 ByteBuf 支持动态的扩容和缩容。而 NIO 中的 ByteBuffer不支持。...3、Netty 中的 ByteBuf 使用了 markedReaderIndex 和 markedWriterIndex 来进行标记,读写时标记互不影响。...而 NIO 中的 ByteBuffer 则只有一个 mark。读写切换时 mark都重置为 -1。 4、Netty 还支持 ByteBuf 的池化技术。...NIO 中的 ByteBuffer 不支持动态扩容。 Netty 中的 ByteBuf 还简化 NIO 中的 ByteBuffer 读写问题。...NIO 中 ByteBuffer,使用 postion、limit、capacity、mark 来维护读写操作、每次读写还需要 flip 等操作,而 Netty 中的 ByteBuf 简化了读写操作,用
Netty里的ByteBuf主要用于发送或接收消息。在JDK里有相似功能的类java.nio.ByteBuffer。...而Netty在设计ByteBuf的时候考虑到API在使用上的便利,对上面提到的两个问题很好的进行了规避。...ByteBuf源码解读 Netty实现自已的ByteBuf是基于jdk自带的ByteBuffer有我们上面所说的两个缺点。...ByteBuf只定义了一些方法,具体的实现通过模板方法模式,将通用的方法在AbstractByteBuf类中实现。...是如何处理引用计数 Netty里通过池技术来重复利用ByteBuf对象,而池必然涉及到回何回收对象,Netty通过对ByteBuf增加一个计数器来实现对无引用对象的回收。
---- netty中用于进行信息承载和交流的类叫做ByteBuf,从名字可以看出这是Byte的缓存区,是对字节数据的封装 粗略地可以从2个维度进行区分:内存分布和内存回收 按照内存分布维度:堆内存字节缓冲区...readerIndex和writerIndex:它们表示ByteBuf中可读和可写的字节索引位置。 maxCapacity:它表示ByteBuf的最大容量大小,即ByteBuf能够扩容的最大限制。 ...一般需要将 ByteBuf 传递给下一个 ChannelHandler,如果在 finally 中 release 了,就失去了传递性(当然,如果在这个 ChannelHandler 内这个 ByteBuf...#read 方法中首次创建 ByteBuf 放入 pipeline(line 163 pipeline.fireChannelRead(byteBuf)) 入站 ByteBuf 处理原则 对原始...,它内部维护了一个 Component 数组,每个 Component 管理一个 ByteBuf,记录了这个 ByteBuf 相对于整体偏移量等信息,代表着整体中某一段的数据。
由于JDK中提供的ByteBuffer无法动态扩容,并且API使用复杂等原因,Netty中提供了ByteBuf。...代码示例: import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.util.Arrays; public...("清空读写指针后ByteBuf为:" + buf.toString()); System.out.println("5.ByteBuf中的内容为:" + Arrays.toString(buf.array...零拷贝机制 Netty的零拷贝机制,是一种应用层的实现,和底层JVM,操作系统内存机制并无过多关联。...buf = Unpooled.wrappedBuffer("Netty".getBytes()); ByteBuf slice = buf.slice(1, 2); slice.unwrap(); System.out.println
前言 字节的流动形成了流,Netty作为优秀的通信框架他的字节是如何流动的,本文就理一下这个事。梳理完Netty的字节流动与JDK提供的ByteBuffer一对比看下Netty方便在哪里。...本分从官方文档概念原理入手梳理,然后看下源码解读下这些原理如何实现的,体验一把Netty写入数据自动扩容,探究下这个过程如何实现的。...二、ByteBuf的构建 接下来通过示例窜下上面的知识点,看下源码是如何实现的,示例中将字符串写入ByteBuf中,然后再读出来打印。...小结 ByteBuf的构建通过Unpooled来分配,示例中通过UnpooledByteBufAllocator持有byte[]、 readerIndex、writerIndex、maxCapacity...读索引readerIndex向前移动 注解@9.2 数据读入新构建的缓存区dst,dst的写索引向前移动 小结: 示例中通过构造一个新的ByteBuf(dst),将源ByteBuf(buf)的数据读入到
编者注:缓冲区在计算机世界中随处可见,内存中的多级缓冲区,io设备的缓冲区等等,还有我们经常用的内存队列,分布式队列等等。缓冲区,平衡了数据产生方和数据消费方的处理效率差异,提高了数据处理性能。...(0)); System.out.println(allByteBuf.getByte(1)); Netty Buffer ByteBuf 是Netty中主要用来数据byte[]的封装类,主要分为Heap...在netty中,根据ChannelHandlerContext 和 Channel获取的Allocator默认都是Pooled,所以需要在合适的时机对其进行释放,避免造成内存泄漏。...在传递过程中自己通过Channel或ChannelHandlerContext创建的但是没有传递下去的ByteBuf也要手动释放。...为了帮助你诊断潜在的泄漏问题,netty提供了ResourceLeakDetector,该类会采样应用程序中%1的buffer分配,并进行跟踪,不过不用担心这个开销很小。
一、概述和原理 网络数据传输的基本单位总是字节,Netty 提供了 ByteBuf 作为它的字节容器,既解决了 JDK API 的局限性,又为网络应用程序提供了更好的 API,ByteBuf 的优点...那么,在 Netty 中要怎么得到 ByteBuf 呢? ...()); //4、返回一个复制了给定数据的 ByteBuf Unpooled.copiedBuffer("Hello Netty",CharsetUtil.UTF_8); } 三、ByteBuf...另外,如果你的数据包含在一个在堆上分配的缓冲区中, 那么事实上,在通过套接字发送它之前, JVM将会在内部把你的缓冲区复制到一个直接缓冲区中。...("Netty!"
网络传输的载体是byte,这是任何框架谁也逃脱不了的一种规定,JAVA的NIO提供了ByteBuffer,用来完成这项任务,当然ByteBuffer也很好的完成了这个任务,Netty也提供了一个名字很相似的载体叫做...ByteBuf,相比于ByteBuf而言,它有着更加更多友善的API,也更加易于维护,并且它可以扩容 一般来说,ByteBuf都是维护一个byte数组的,它的内部格式是长成这个样子的 * +...目前为止,Netty提供来的ByteBuf都是堆内内存,大概是因为我们平时写的都是channel,写的是业务逻辑的代码 我们可以看到堆外内存分配的源代码: DirectByteBuffer(int...= Cleaner.create(this, new Deallocator(base, size, cap)); att = null; } 并且在我们平时的普通开发中,...用的也是Unpool类型的普通ByteBuf,但是在一些高并发的应用中,Pooled化的ByteBuf性能会更加优秀 关于ByteBuf初步的了解就这么多了,先暂时分享一下,希望以后能有其他的使用体会
之前的关于【Netty】的文章我们已经了解到 Netty 里面数据读写是以 ByteBuf 为单位进行交互的,这一小节,我们就来详细剖析一下 ByteBuf 之前文章链接: 【Netty】NIO编程的利器...capacity,表示 ByteBuf 底层内存的总容量,从 ByteBuf 中每读取一个字节,readerIndex 自增1,ByteBuf 里面总共有 writerIndex-readerIndex...,并不代表不能往 ByteBuf 中写数据了, 如果发现往 ByteBuf 中写数据写不进去的话,Netty 会自动扩容 ByteBuf,直到扩容到底层的内存大小为 maxCapacity,而 maxWritableBytes...writeByte() 表示往 ByteBuf 中写一个字节,而 buffer.readByte() 表示从 ByteBuf 中读取一个字节,类似的 API 还有 writeBoolean()、writeChar...返回的 ByteBuf 中写数据不会影响到原始的 ByteBuf slice() 和 duplicate() 不会改变 ByteBuf 的引用计数,所以原始的 ByteBuf 调用 release()
领取专属 10元无门槛券
手把手带您无忧上云