前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty中的ByteBuf详解

Netty中的ByteBuf详解

作者头像
爬蜥
发布2019-07-09 10:27:11
1.1K0
发布2019-07-09 10:27:11
举报
文章被收录于专栏:爬蜥的学习之旅

ByteBuf是做什么用的?Netty中传递字节数据的容器。

ByteBuf的使用模式有那些?

使用模式

描述

优点

劣势

堆缓冲区

数据存存储在JVM的堆空间中,又称为支撑数组,通过 hasArray 来判断是不是在堆缓冲区中

没使用池化情况下能提供快速的分配和释放

发送之前都会拷贝到直接缓冲区

直接缓冲区

存储在物理内存中

能获取超过jvm堆限制大小的空间写入channel比堆缓冲区更快

释放和分配空间昂贵(使用系统的方法)操作时需要复制一次到堆上

复合缓冲

单个缓冲区合并多个缓冲区表示

操作多个更方便

-

  • 能获取超过jvm堆限制大小的空间
  • 写入channel比堆缓冲区更快
  • 释放和分配空间昂贵(使用系统的方法)
  • 操作时需要复制一次到堆上

复合缓冲 单个缓冲区合并多个缓冲区表示 操作多个更方便-

ByteBuf如何访问?

  1. 下标访问:get,set开头的相关方法,不修改索引
  2. 索引访问:read,write开头的方法,根据已经访问过的字节对索引进行调整[索引是ByteBuf内置的readIndex和writeIndex]

ByteBuf本身有一定的容量限制,默认最大的是Integer.MAX_VALUE,超出范围抛IndeOutOfBoundsException

ByteBuf索引操作是怎样?

两个索引将ByteBuf分隔成3个区域

任何新分配的、包装的或者复制的默认大小readerIndex/writeIndex都是0,任何read或者skip开头的都会增加readerIndex已读字节数,write开头的操作则会增加writeIndex相应字节数。另外参数中包含ByteBuf且没有目标索引的[比如 readBytes(ByteBuf dest) writeBytes(ByteBuf dest)],会影响对应的readerIndex(写的方法影响readerIndex)writeIndex(读的方法影响writeIndex)。

调用discardReadBytes()会移动可读字节到下标0,可读字节平移(原来可读字节的内容没有做擦除,只是移动了writeIndex)

调用clear()方法,则仅重置索引,使得readIndex和writeIndex为0,不做任何内存复制

ByteBuf的派生缓冲区是什么?

ByteBuf专门呈现内容视图的方法,它们返回新的ByteBuf实例有自己的索引,但是内部存储共享,即它的内容修改了源实例也会改变。方法比如 slice / Unpooled.unmodifiableBuffer / order / readSlice / duplicate 。

需要完全独立的副本则选择使用 copy

ByteBuf有没有其它方式来管理实例?

  1. ByteBufAllocator:使用ChannelHandleContext(Channel每个都有不同的实例,或者ChannelHandler获取)能够拿到它的引用,Netty从4.1.x开始默认使用池化(PooledByteBufAllocator)实现,能最大程度的减少内存碎片,另外一种方式是非池化(UnpooledByteBufAllocator)每次返回一个新实例;
  2. Unpooled:一个工具类,提供静态方法创建未池化的ByteBuf
  3. ByteBufUtil:实现一些使用的方法,比如equals判断两个ByteBuf是不是相等,hexdump以十六进制打印ByteBuf内容
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年05月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ByteBuf的使用模式有那些?
  • ByteBuf如何访问?
  • ByteBuf索引操作是怎样?
  • ByteBuf的派生缓冲区是什么?
  • ByteBuf有没有其它方式来管理实例?
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档