文档章节

Netty_ByteBuf的基本用法(一)

秋风醉了
 秋风醉了
发布于 2014/06/23 20:58
字数 991
阅读 4291
收藏 0

Netty s buffer API has two interfaces: 

  • ByteBuf 

  • ByteBufHolder

ByteBuf - The byte data container

Whenever(每当)  you  need  to  interact(相互作用)  with  a  remote  peer  such  as  a  database,  the  communication needs to be done in bytes. For this and other reasons an efficient(高效), convenient, and easy-to-use data structure  is required, and Netty's ByteBuf implementation  meets these requirements and more, making it an ideal data container, optimized(最佳的) for holding and interacting with bytes. ByteBufis a data container that allows you to add/get bytes from it in an efficient way. To make it easier to operate, it uses two indices: one for reading and one for writing. This allows you to read data out of them in a sequential way and "jump" back to read it again. All you need to do is adjust(调整) the reader index and start the read operation again.


How it works

After  something  is  written  to  the ByteBuf, its writerIndex is  increased  by  the  amount  of bytes written. After you start to read bytes, its readerIndexis increased. You can read bytes until  the writerIndex and readerIndex are  at  the  same position.  The  ByteBuf then becomes  unreadable,  so  the  next  read  request  triggers(触发) an IndexOutOfBoundsException similar to what you ve seen when trying to read beyond the capacity of an array. Calling any of the buffer s methods beginning with "read" or "write" automatically(自动的) advances the  reader  and  writer  indexes  or  you. There  are  also  relative  operations  to set  and   get bytes. These don t move the indexes but operate on the relative(相对的) index that was given. A ByteBuf may  have  a maximum  capacity(容量)  to  set  an  upper  limit(上限)  to  the  maximum  data  it can hold, trying to move the writer index beyond this capacity will result in an exception. The default limit is Integer.MAX_VALUE. 

Figure 5.2 shows how a ByteBufis laid out. 

 

As  Figure  5.1  shows,  a ByteBuf is  similar  to  a  byte  array,  the  most  notable(显著的)  difference  being the  addition  of  the read  and  write  indices  which  can  be used  to control  access  to  the  buffer's data. You ll  learn  more  about  the  operations  that can  be  performed  on  a ByteBuf in  a  later section. For now, keep this in mind and let s review the different types of ByteBufthat you ll most likely use. 


Different types of ByteBuf

There are three different types of ByteBuf you ll encounter when using Netty (there are more, but these are used internally). You may end up implementing your own, but this is out of scope here. Let s look at the provided types that you are most likely interested in. 

HEAP BUFFERS

The  most  used type is the ByteBuf that stores  its data  in the heap space(堆内存) of the JVM.  This  is done  by  storing  it  in a  backing  array.  This  type  is  fast  to  allocate  and  also  de-allocate  when you 're  not  using  a  pool.  It  also  offers  a  way  to directly  access  the  backing  array,  which  may make it easier to interact with legacy(遗留的) code . 

DIRECT BUFFERS

Another ByteBuf implementation  is  the   direct  one.Direct  means  that  it  allocates  the memory  directly,  which  is  outside  the heap . You won' t  see  its memory  usage  in  your  heap space. You must take this into account when calculating the maximum amount of memory your application will use and how to limit it, as the max heap size won' t be enough. Direct buffers on the  other side  are  optimal(最佳的,最优的) when  it s  time  to transfer  data  over  a  socket. In  fact,  if  you  use a nondirect  buffer,  the  JVM will  make  a copy  of  your  buffer  to  a  direct  buffer internally(实质上)  before sending it over the socket. The  down  side  of  direct buffers is  that they' re  more expensive  to  allocate(分配)  and  de-allocate compared to heap buffers. This is one of the reasons why Netty supports pooling, which makes this problem disappear. Another possible down side can be that you' re no longer able to access the data  via the  backing  array,  so  you' ll  need  to  make  a copy  of  the  data  if  it  needs  to  work with legacy code that requires this. The following listing shows how you can get the data in an array and call your method even without the ability to access the backing array directly. 

COMPOSITE BUFFERS

The  last ByteBuf implementation  you  may  be  confronted(面对的)  with  is  the  CompositeByteBuf. This  does  exactly what its  name  says;  it  allows  you  to  compose different ByteBuf instances and provides a view over them. The good thing is you can also add and remove them on-the-fly(在传输过程中), so it s kind of like a List. If you ve ever worked with the JDK's ByteBuffer you' ve most likely missed such a feature there. As the CompositeByteBufis just a view over others, the hasArray() method  will  return false  because  it may  contain  several  ByteBuf instances  of both direct and nondirect types. For  example,  a  message  could  be  composed  of  two parts:  header and  body.  In  a modularized application, the two parts could be produced by different modules and assembled later when  the  message  is  sent  out.  Also,  you may  use  the  same  body  all  the  time  and  just change the header. So it would make sense here to not allocate a new buffer every time. This  would  be  a  perfect fit  for  a CompositeByteBuf as  no  memory  copy  will be  needed and the same API could be used as with non-composite buffers. 


Figure  5.2  shows  how  a CompositeByteBuf would  be  used  to  compose(组成)  the  header  and body.

======END======

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 237
博文 578
码字总数 419908
作品 0
朝阳
程序员
Netty精粹之玩转NIO缓冲区

在JAVA NIO相关的组件中,ByteBuffer是除了Selector、Channel之外的另一个很重要的组件,它是直接和Channel打交道的缓冲区,通常场景或是从ByteBuffer写入Channel,或是从Channel读入Buffer;...

Float_Luuu
2016/03/13
2.2K
0
对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解

根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is fre......

永顺
2017/11/29
0
0
Netty源码:从一个简单Demo开始

最近在看闪电侠的《Netty深入剖析》,记录总结。 一.Netty简单示例 首先先看一个简单的HelloWord:Server.java 和 ServerHandler.java Server.java 启动Server,运行结果如下: 二.Netty是对...

Jacktanger
07/15
0
0
Netty_ByteBuf基本用法(二)

NettyByteBuf基本用法二 上一篇http://my.oschina.net/xinxingegeya/blog/283227 ByteBuf's byte operations #1 Segment(段) that holds bytes that can be discarded(废弃的) as they ......

秋风醉了
2014/06/29
0
0
Netty Buffer

Netty高性能很大原因在于Netty Buffer的设计,Netty Buffer由Nio Buffer而来,并对Nio Buffer做了改进。首先,Netty Buffer的“零拷贝”特性使得Netty Buffer的性能十分优越;还有Netty内存池...

AaronSheng
2016/10/15
27
0

没有更多内容

加载失败,请刷新页面

加载更多

java序列化(七) - fst 序列化

java序列化(七) - fst 序列化 github https://github.com/RuedigerMoeller/fast-serialization 实践 https://gitee.com/mengzhang6/serializable-demo.git maven依赖 <!-- https://mvnrepo......

晨猫
28分钟前
2
0
智力问题汇总

南京新建地铁线路,给你2块钱,测出来需要配置多少辆车? 参考答案:根据地铁有固定时间间隔,坐一圈该线路,推算出需要多少辆。 一共50张卡片,上面写着1--50 ,50个数字,藏起来一张,打乱...

职业搬砖工程师
32分钟前
2
0
ZFS-自我恢复RAID

ZFS-自我恢复RAID 这个给了我一个简单而又强大的理由,让我立马为之折服,ZFS可以自动的检测发生的错误,而且,可以自我修复这些错误。假设有一个时刻,磁盘阵列中的数据是错误的,不管是什么...

openthings
41分钟前
2
0
从Hash到一致性Hash原理(深度好文)

要讲一致性Hash原理,先从一般性Hash讲起,其实Hash的本质就是一个长度可变的数组,那为什么Hash的时间复杂度是O(1),而其他类型的数据结构查找都是要遍历来,遍历去,即便是树,二叉树,也是要经过几...

算法之名
54分钟前
22
0
软件测试工具书籍与面试题汇总下载(持续更新)

简介 本文是https://github.com/china-testing/python-api-tesing/blob/master/books.md 的节选。 欢迎转载,转载请附带此简介,谢谢! 试题 软件测试综合面试题(高级测试)-试题.pdf 软件测试...

python测试开发人工智能安全
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部