在Java NIO 中,ByteBuffer通常作为通信中传递消息的载体。而在Mina中,采用了IoBuffer代替ByteBuffer。Mina给出了不用ByteBuffer的两个主要理由:

1.  ByteBuffer未提供一些常用到的get/set方法,如:fill, get/putString, get/putAsciiInt

这里附上,fill方法在AbstractIoBuffer中的实现,可以看到程序分别采用Long,Int,Short,byte对指定size的byte内容进行了快速填充,而不是采用for循环,是个有趣的技巧。

public IoBuffer fill(byte value, int size) {
autoExpand(size);
int q = size >>> 3;
int r = size & 7; if (q > 0) {
int intValue = value | value << 8 | value << 16 | value << 24;
long longValue = intValue;
longValue <<= 32;
longValue |= intValue; for (int i = q; i > 0; i--) {
putLong(longValue);
}
} q = r >>> 2;
r = r & 3; if (q > 0) {
int intValue = value | value << 8 | value << 16 | value << 24;
putInt(intValue);
} q = r >> 1;
r = r & 1; if (q > 0) {
short shortValue = (short) (value | value << 8);
putShort(shortValue);
} if (r > 0) {
put(value);
} return this;
}

2. ByteBuffer一旦分配,容量固定,不易扩展。

在Mina的实现中,IoBuffer的扩展是通过重新分配一块新的更大的ByteBuffer,并把旧的ByteBuffer拷贝到新的当中实现的,这种实现的问题显而易见,可能导致频繁分配内存,生成内存碎片。另外,在用户使用DirectBuffer时,频繁的内存分配和释放(ByteBuffer.clear())可能导致内存不能及时回收,从而导致内存泄漏。关于IoBuffer自动扩展的问题在Mina的官方网站上也有提及:

This will change in MINA 3. The main reason why MINA has its own wrapper on top of nio ByteBuffer is to have extensible buffers. This was a very bad decision. Buffers are just buffers : a temporary place to store temporary data, before it is used. Many other solutions exist, like defining a wrapper which relies on a list of NIO ByteBuffers, instead of copying the existing buffer to a bigger one just because we want to extend the buffer capacity.
It might also be more comfortable to use an InputStream instead of a byte buffer all along the filters, as it does not imply anything about the nature of the stored data : it can be a byte array, strings, messages... Last, not least, the current implementation defeat one of the target : zero-copy strategy (ie, once we have read the data from the socket, we want to avoid a copy being done later). As we use extensible byte buffers, we will most certainly copy those data if we have to manage big messages. Assuming that the MINA ByteBuffer is just a wrapper on top of NIO ByteBuffer, this can be a real problem when using direct buffers.

总结起来主要是:0. 实现自动扩展是错误的决定; 1. 可以有更好的实现方式,如ByteBuffer List;  2. 违反了zero-copy 原则;  3. 在用户使用Direct模式管理较大的Message存在内存泄漏的风险。

可见Mina对于ByteBuffer的包装IoBuffer是存在一定问题的,官方考虑放弃。但是Mina社区目前基本处于停滞状态。(最新的稳定版本时间还是2016年10月)

Mina 组件介绍之 IoBuffer的更多相关文章

  1. Mina 组件介绍之 IoAcceptor 与 IoConnector

    在网络通信中,Socket通信的双方分为服务端与客户端,在Java NIO 的实现中采用Socket/ServerSocket, SocketChannel/ServerSocketChannel分别 ...

  2. Mina各组件介绍

    Mina各组件介绍 上一篇文章已经系统的介绍了Mina的运行流程,Apache推出的Mina性能上很是高效,上章节我们知道内部有很多的类,各个类之间的依赖也是很多,他们之家都是相互依赖. 下面主要看看 ...

  3. 开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)

    在这个.NET组件的介绍系列中,受到了很多园友的支持,一些园友(如:数据之巅. [秦时明月]等等这些大神 )也给我提出了对应的建议,我正在努力去改正,有不足之处还望大家多多包涵.在传播一些简单的知识的 ...

  4. 免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)

    前面介绍了六种.NET组件,其中有一种组件是写文件的压缩和解压,现在介绍另一种文件的解压缩组件SharpZipLib.在这个组件介绍系列中,只为简单的介绍组件的背景和简单的应用,读者在阅读时可以结合官 ...

  5. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  6. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  7. 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)

    在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...

  8. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  9. 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)

    在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“.毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单 ...

随机推荐

  1. Fragstats:使用R软件读取frag78b.asc文件

    Fragstats中,有一个用于熟悉Fragstats软件的demon,在tutorial中的1种,有reg78b.asc文件,其文件内容是包含了山歌图像的行数和列数以及分辨率大小等基本信息. 采用R ...

  2. 由AlphaGO引发的思考

    这几天AlphaGO的人机大战炒得热火朝天,给谷歌的AI做了一次大大的广告,可谓风头出尽,大有AI战胜一切的“趋势”.而且,像阿法狗.阿法猫之类的新词不断,成了饭前茶后人们议论的热点.作为一个留学过日 ...

  3. EBS登陆界面IE显示异常

    使用在IE浏览登陆EBS时: 在登陆界面,登录和取消的按钮显示异常: 在进入HOME界面时,显示的职责全为undefined. 原因: 由于IE版本的兼容性. 解决方法: 浏览器 菜单->工具- ...

  4. ListView下拉刷新和PullToRefreshListView实现

    下拉刷新-------    1.addHeaderView必须在setAdapter之前调用    2.将paddingTop设置一个headerView高度的负值去隐藏它        getHe ...

  5. python str、int、dict

    一.str print(dir(int))#['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', ...

  6. RBG灯颜色渐变(颜色要尽可能多)程序分析

    相信很多调过RBG灯的朋友都是通过分别改变R.B.G的占空比来改变颜色的,但是不是发现了一个问题,那就是不管怎样调都很难实现几十种颜色的变化,一般只有是7种颜色的渐变.下面给朋友们分享一个可以实现几十 ...

  7. SVNKit学习——svn二次开发背景和闲谈(一)

    开发背景: 简述现有流程:代码的合并.提交是以任务为最小单元的.例如A和B两个同学开发不同的任务,那就是两个任务号.合并的时候可能会先合并A的代码,在合并B的代码. 需求:SVN合并程序开发——一款能 ...

  8. Angular5+ 自定义表单验证器

    Angular5+ 自定义表单验证器 Custom Validators 标签(空格分隔): Angular 首先阐述一下遇到的问题: 怎样实现"再次输入密码"的验证(两个cont ...

  9. sublime text3 英文版转为中文版

    第一步设置好:https://packagecontrol.io/installation#st3 简单几步 : 1. 点击菜单栏中“preferences”,弹出选项中找到“package cont ...

  10. Android(java)学习笔记47:通过反射获得构造方法并且使用

    1. 获取字节码文件对象:             Class c = Class.forName("cn.itcast_01.Person"); 2. 获取构造方法       ...