netty in action 笔记 二
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 笔记 二的更多相关文章
- 《Netty in action》 读书笔记
声明:这篇文章是记录读书过程中的知识点,并加以归纳总结,成文.文中图片.代码出自<Netty in action>. 1. 为什么用Netty? 每个框架的流行,都一定有它出众的地方.Ne ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- Elasticsearch笔记二之Curl工具基本操作
Elasticsearch笔记二之Curl工具基本操作 简介: Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式.-X指定http请求的方法,-d指定要传输的数据. 创建索 ...
- 《精通并发与Netty》学习笔记(01 - netty介绍及环境搭建)
一.Netty介绍 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. ...
- 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 非阻塞网络编程原 ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}
笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...
- Mastering Web Application Development with AngularJS 读书笔记(二)
第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...
- Python 学习笔记二
笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...
随机推荐
- java连接linux的三种方式(附执行命令)
# 本地调用使用JDK自带的RunTime类和Process类实现 public static void main(String[] args){ Process proc = RunTime.get ...
- 架构模式:MVC与MVVM
本文探讨如下几个问题: 什么是MVC 什么是MVVM MVC与MVVM对架构属性的影响 MVC实例SpringMVC MVVM实例Vue MVC.MVVM与Layer中的Model,Controlle ...
- MyBatis之Mapper XML 文件详解(三)-Result Maps
resultMap 元素是 MyBatis 中最重要最强大的元素.它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事 情 ...
- NopCommerce学习(2) EntityFramework
NopCommerce-EntityFramework开发:主要是Controller-Service-Repository的开发方式 操作数据库,主要对象是BaseEntity,IDbContext ...
- 关于从Oracle数据库中删除表数据
1,删除表 drop 1.1 执行drop table table_name 语句 被 drop后的表被放在用户回收站(user_recyclebin)里,而没有被直接删除掉,回收站里的表可以被恢复 ...
- Linux Centos6.5 升级默认Python2.6.6到Python2.7.13
以下例子基于python 2.7.9,其他版本同理.大致的命令都是差不多的,安装完成之后,输入Python --vertion ,看到系统默认的版本已经替换为2.7版本了 1.下载python wge ...
- 树莓派3B+学习笔记:3、启用root账户
1.打开终端,输入 sudo passwd root 输入两次密码后设置root账户密码: 2.输入 sudo passwd --unlock root 解锁root账户: 3.点击主菜单的“Shut ...
- centos配置NTP服务器
时间服务器: NTP(Network Time Protocol,网络时间协议)是用来使用网络中的各个计算机时间同步的一种协议,NTP服务器就是利用NTP协议提供时间同步服务的. 一.环境准备: 1. ...
- C指针(4)——数据结构中指针的应用(非常重要)
5-1动态内存分配,分配的是堆内存的空间 分配内存函数 (都集中在库函数 stdlib.h 中) void *malloc (unsigned int num_bytes); //指定分配内存空间大 ...
- war2 洛谷模拟赛day2 t3 状压
(new ) war2 题解:总体数据而言,我们很容易想到着就是DP啊,我们DP数组,用状态压缩,代表有那些点已经被占领过了,代表上一次我占的是那个.对于每一次状态转移,若当前我们要占领的Port ...