博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Netty Buffer
阅读量:5971 次
发布时间:2019-06-19

本文共 1373 字,大约阅读时间需要 4 分钟。

hot3.png

    Netty高性能很大原因在于Netty Buffer的设计,Netty Buffer由Nio Buffer而来,并对Nio Buffer做了改进。首先,Netty Buffer的“零拷贝”特性使得Netty Buffer的性能十分优越;还有Netty内存池使得Netty Buffer性能大幅提高,内存不断的创建和回收会大幅度地影响性能,内存池恰好解决了这个问题;另外,Nio Buffer操作是比较复杂的,Netty同样做了改进,所以Netty Buffer操作起来十分方便。

零拷贝:
1. Direct Buffer。Netty使用对外的内存进行Socket数据发送和接收,避免了数据的二次拷贝。如果使
JVM堆内存的话,JVM会将数据拷贝到内存,然后进行Socket读写;
2. Composite Buffer。组合Buffer将多个Buffer封装成一个Buffer对外操作,避免了多个Buffer拷贝拼成一个Buffer。
内存池:
PooledByteBuf使用内存池的形式,将内存放在一个集合中,当内存回收时不会立刻释放,而是重复利用,从而达到减少内存不断创建和回收的目的。
ByteBuf:
ByteBuf就是个byte容器。ByteBuf被划分为三节:
a) reader index前面的数据是已经读过的数据,这些数据可以扔掉
b) 从reader index开始,到writer index之前的数据是可读数据
c) 从writer index开始,为可写区域
ByteBufAllocator:
ByteBufAllocator是抽象工厂类,ByteBuf实例通常应该由ByteBufAllocator来创建
PooledByteBufAllocator创建PooledByteBuf,维持了一个byte[]和ByteBuffer的池。
UnpooledByteBufAllocator创建UnpooledByteBuf。
PooledByteBuf比UnpooledByteBuf性能要高出20多倍。
ByteBuf:
a) 按照内存实现方式不同分为:
HeapByteBuf是JVM中的内存,基于byte[]。
DirectByteBuf是通过本地方法创建的JVM之外的内存,基于Nio ByteBuffer。
UnsafeDirectBuf是通过本地方法创建的JVM之外的内存,基于Nio ByteBuffer,系统要提供sun.misc.Unsafe。
DirectByteBuf通过本地方法创建JVM之外的内存,Socket可以直接使用而不需要经过拷贝。
b) 按照是否支持池共享分为:
PooledByteBuf
UnpooledByteBuf
c) CompositeBuf:
CompositeByteBuf是一个虚拟的buffer,将多个buffer展现为一个简单合并的buffer,避免多个小buffer拷贝合并成一个大buffer。
FixedCompositeByteBuf功能类似CompositeByteBuf, 以只读的方式包装一个ByteBuf数组,通常用于写入一组ByteBuf的内容。

转载于:https://my.oschina.net/u/2950586/blog/758880

你可能感兴趣的文章
Beta冲刺——day6
查看>>
在一个程序中调用另一个程序并且传输数据到选择屏幕执行这个程序
查看>>
代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能
查看>>
关于在VS2005中编写DLL遇到 C4251 警告的解决办法
查看>>
提高信息安全意识对网络勒索病毒说不
查看>>
css+div+jquery弹出层
查看>>
求职相关(链接,不定期更新)
查看>>
maya pyside 多个窗口实例 报错 解决
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
MVC中的三个模块
查看>>
Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
查看>>
oracle 常用命令大汇总
查看>>
mysql 并行复制
查看>>
傲不可长,欲不可纵,乐不可极,志不可满——提高个人修养
查看>>
后台调用gps
查看>>
HTML5标签的语义认知和理解(1)
查看>>
MySQL日志功能详解(2)
查看>>
HP LaserJet 305X 和 339X 系列一体机如何设置手动或自动接收传真?
查看>>
XDCTF成长记录
查看>>