netty的数据容器

网络数据的基本单位大多为字节,Java NIO 提供了ByteBuffer 作为它的字节容器,但使用起来过于复杂和繁琐。在Netty中, ByteBuffer 替代品是ByteBuf,一个强大的实现,既解决了JDK API 的局限性,又为网络应用程序的开发者提供了更好的API。由不同的索引分别控制读访问和写访问的字节数组。

ByteBuf

Netty 的数据处理API 通过两个组件暴露给用户,它们是 abstract class ByteBuf 和interface ByteBufHolder。

下面是一些ByteBuf API 的优点:

  1.  可以被用户自定义的缓冲区类型扩展;
  2.  通过内置的复合缓冲区类型实现了透明的零拷贝;
  3. 容量可以按需增长(类似于JDK 的StringBuilder);
  4. 在读和写这两种模式之间切换不需要调用ByteBuffer 的flip()方法;
  5.  读和写使用了不同的索引;
  6.  支持方法的链式调用;

  7. 支持引用计数;

  8. 支持池化。

ByteBuf 的使用模式

  堆缓冲区:将数据存储在JVM 的堆空间中,使用数组实现

      堆缓冲的优点是:由于数据存储在JVM的堆中可以快速创建和快速释放,并且提供了数组的直接快速访问的方法。

      堆缓冲缺点是:每次读写数据都要先将数据拷贝到直接缓冲区再进行传递。

      直接缓冲区:NIO 在JDK 1.4 中引入的ByteBuffer 类允许JVM 实现通过本地调用来分配内存。

这主要是为了避免在每次调用本地I/O 操作之前(或者之后)将缓冲区的内容复制到一个中间缓冲区(或者从中间缓冲区把内容复制到缓冲区)。ByteBuffer的                             Javadoc明确指出:“直接缓冲区的内容将驻留在常规的会被垃圾回收的堆之外。直接缓冲区的主要缺点是,相对于基于堆的缓冲区,它们的分配和释放都较为                               昂贵。在处理遗留代码时,因为数据不在堆上,所以需要将数据全部复制

                         

    复合缓冲区:复合缓冲区就类似于一个ByteBuf的组合视图,在这个视图里面我们可以创建不同的ByteBuf(可以是不同类型的)。 这样,复合缓冲区就类似于一个列表,我们可以动态的往里面添加和删除其中的ByteBuf。

      

ByteBufHolder接口:存储ByteBfu的各种属性值

ByteBuf的分配:

按需分配:ByteBufAllocator 接口

  可以通过Channel(每个都可以有一个不同的ByteBufAllocator 实例)或者绑定到ChannelHandler 的ChannelHandlerContext 获取一个到ByteBufAllocator 的引用。

Netty提供了两种ByteBufAllocator的实现:PooledByteBufAllocator和Unpooled-ByteBufAllocator。前者池化了ByteBuf的实例以提高性能并最大限度地减少内存碎片。此实

现使用了一种称为jemalloc的已被大量现代操作系统所采用的高效方法来分配内存。后者的实现不池化ByteBuf实例,并且在每次它被调用时都会返回一个新的实例。

  虽然Netty默认使用了PooledByteBufAllocator,但这可以很容易地通过Channel-Config API或者在应用程序中指定一个不同的分配器来更改。

 Unpooled 缓冲区:   

  它提供了静态的辅助方法来创建未池化的ByteBuf实例。

  

ByteBufUtil 类:  

  ByteBufUtil 提供了用于操作ByteBuf 的静态的辅助方法。因为这个API 是通用的,并且和池化无关,所以这些方法已然在分配类的外部实现。

引用计数:当指向某个对象的引用数目为0时,该对象所占资源将被回收。

  引用计数对于池化实现(如PooledByteBufAllocator)来说是至关重要的,它降低了内存分配的开销。

要点:

  1. 使用不同的读索引和写索引来控制数据访问;

  2. 使用内存的不同方式——基于字节数组和直接缓冲区;

  3. 通过CompositeByteBuf 生成多个ByteBuf 的聚合视图;

  4. 数据访问方法——搜索、切片以及复制;

  5. 读、写、获取和设置API;

  6. ByteBufAllocator 池化和引用计数。

 

netty in action 笔记 二的更多相关文章

  1. 《Netty in action》 读书笔记

    声明:这篇文章是记录读书过程中的知识点,并加以归纳总结,成文.文中图片.代码出自<Netty in action>. 1. 为什么用Netty? 每个框架的流行,都一定有它出众的地方.Ne ...

  2. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  3. Elasticsearch笔记二之Curl工具基本操作

    Elasticsearch笔记二之Curl工具基本操作 简介: Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式.-X指定http请求的方法,-d指定要传输的数据. 创建索 ...

  4. 《精通并发与Netty》学习笔记(01 - netty介绍及环境搭建)

    一.Netty介绍     Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.     ...

  5. Netty | 第1章 Java NIO 网络编程《Netty In Action》

    目录 前言 1. Java 网络编程 1.1 Javs NIO 基本介绍 1.2 缓冲区 Buffer 1.2 通道 Channel 1.3 选择器 Selector 1.4 NIO 非阻塞网络编程原 ...

  6. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  7. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  8. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  9. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

随机推荐

  1. 点击HTML页面问号出现提示框

    本demo的功能:点击页面按钮在其边缘出现提示信息,点击页面任何一处则消失. 如下图: 1.所需插件: jquery插件: layer插件: 2.HTML内容: ==注意==: class=" ...

  2. php开发微信图灵机器人

    本着开源为原则,为这个世界更美好作出一份共享,我就给大家做个指路人,如果实用,记得给提供开源的朋友一些鼓励. 简单介绍一下实现思路,使用swoole扩展接管php运行,由于swoole只能在类UNIX ...

  3. 个人开源Git地址

    开源Git地址 序号 Git地址 描述 1 https://github.com/winds-june 各种源码.直接调用的jar包          2    

  4. about route

    route add default dev  my_iface1 route del default route add default gw 192.168.120.1 route add -net ...

  5. C++常用的系统函数

    数学<math.h>: 1 三角函数 double sin (double); double cos (double); double tan (double); 2 反三角函数 doub ...

  6. chromium之observer_list

    典型用法如下 /////////////////////////////////////////////////////////////////////////////// // // OVERVIE ...

  7. Spring的jar包不同版本的下载地址

    http://repo.spring.io/release/org/springframework/spring/ 可以直接下载不同版本的spring jar包

  8. Action与Func 用法

    //vs2017 + framework4.6.2 //zip    https://github.com/chxl800/ActionFuncDemo //源文件git   https://gith ...

  9. go语言学习(一):数组/切片

    学习区块链之后,发现还要学习加密,接触到的视频是:Go的crypto包,所以开始接触Go.因为和solidity有些相似,但是比solidity简单一些,就开始放松的心态去学习.每天翻着go菜鸟教程, ...

  10. angular-sanitize 插件的使用,获取带html标签的内容

    1,安装 angular-sanitize bower install angular-sanitize --save 引入到 html <script src="/bower_com ...