Mina2 研究总结
一、Mina框架。
Mina的框架大概是这么个样子:
底层由Java 的NIO 1.0实现 核心架构应该是这样:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmFueXVuNzY1NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
内部有三个层次:
I/O Service:实际运行的 I / O ,能够选择现成的Services 如 Acceptor 也能够自己实现。
I/O Filter Chain :由多个过滤器组成的过滤器链。在这个环节将字节过滤或转换为预想的数据结构,反之亦然。
I/O Handler :实际的业务逻辑部分。
Server 端应用,创建一个基于 MINA 的应用程序,主要分为三步、
1、Create I/O Service 。IOAcceptor 监听指定的port。处理网络连接请求;一旦一个新的连接到达,IOAcceptor 产生一个session,兴许全部从这个IP和port发送过来的请求都将被这个Session处理。
2、Create Filter Chain。从现有的Filters 中选择或者创建一个传输 Request / Response 的自己定义的Filter 。Session创建之后全部的数据包都被放到过滤器链中。通过过滤器将原始的字节码转变为高层的对象,继承这两个接口完毕自己的编码解码 ProtocolEncoderAdapter ProtocolDecoderAdapter
。
3、Create I/O Handler。
终于数据包或者对象被传送给Handler 做业务逻辑处理。
二、IoService。
IoService 是一个接口,两种实现方式:IoAcceptor IoConnector .IoAcceptor是针对Server端。IoConnector 是针对Client端。IoService的主要职责:监听器管理、IoHandler、IoSession管理、FilterChain管理、Statistics 管理
三、IoAcceptor:
主要用于创建新的连接,Mina提供了多种实现,基本不用自己再去实现。
NioSocketAcceptor:无堵塞的Socket 传输 Acceptor 针对TCP。
NioDatagramAcceptor:无堵塞的Socket传输Acceptor 针对UDP。
AprSocketAcceptor:堵塞的Socket 传输 Acceptor 基于 APR。
VmPipeSocketAcceptor :the in VM Acceptor
IoConnector:
针对Client端的Socket连接。也有多种实现。
NioSocketConnector:无堵塞的Socket 传输 Acceptor 针对TCP
NioDatagramConnector:无堵塞的Socket 传输 Acceptor 针对UDP
AprSocketConnector:堵塞的Socket传输Connector 基于 APR
ProxyConnector:支持代理服务的Connector,通过截取连接的请求,并将终端指向代理设置的地址
SerialConnector:针对串口传输的Connector
VmPipeConnector:the in vm Connector
四、Session。不论什么时候仅仅要有新的连接到来,都会生成一个Session对象。而且保存在内存中,直到断开连接
Session状态包含:
五、IoBuffer。IoBuffer是MINA内部的byte buffer,是对Java NIO ByteBuffer的封装,同一时候扩展了一些更加有用的方法。
capacity属性描写叙述这个缓冲区最多能缓冲多少个元素。也是Buffer的最大存储元素数,这个值在创建Buffer的时候指定,不能改动。
Limit 是从Buffer中向Channel中写入数据时,limit变量指示还剩多少数据能够读取,在从Channel中读取数据到Buffer 中时,limit变量指定还剩多少空间能够存放数据。position正常情况应该小于等于 limit
Position Buffer实际上也是一个Array。当从Channel 读取数据时。将读出来的数据放进底层array,position 变量用来跟踪截止眼下为止已经写入多少数据。
它指示假设下次写入Buffer时数据应该进入那个Array位置,比方已经读取10字节,position被置为10。指向array第四个位置。
Mark:一个能够记忆的Position位置的值。调用 reset() 方法时会将Position重置为该索引的值,可是Mark并不总是须要定义。可是须要定义时不能定义为负数,不能大于Position,假设定义了Mark 则该Position 或 Limit 调整为小于Mark值时,Mark将被丢弃。例:
i、初始状态下:
此时position为0,limit和capacity都被设为9;

ii、从Channel中读入4个字节数据到Buffer,这时position指向4(第5个):

iii、在做写操作之前,我们必须调用一次flip()方法,这种方法做了两件重要的事情:
1. 将limit设置到当前的position处。
2. 设置position为0。

iiii、运行写操作后;

iv、运行clear后,position设为0,limit设为capition,mark则丢弃。

IoBuffer是一个抽象类。不能直接实例化,所以使用的时候须要调用allocate 方法进行内存分配
IoBuffer buf = IoBuffer.allocate(len);
IoBuffer buf1 = IoBuffer.allocate(len, true);
默认direct 是false。得到 heap buffer。假设是true 得到 direct buffer。
Direct Buffer 不是分配在堆上,不被GC管理(可是java对象归GC管理。所以GC回收了对象。direct申请的空间也会被释放)。
Heap Buffer 分配在堆上,可以理解为byte[]的封装。可是当我们把heap buffer写入Channel时,底层会先构建一个暂时DirectBuffer,然后复制heap buffer内容,再把这个 direct buffer写出去,由于 direct buffer写入Channel速度快,可是创建和销毁的代价高。所以在可以重用的地方使用。
大文件时,heap buffer复制代价高。用DirectBuffer可以提高性能。下载文件除了SendFile机制还有 内存映射 MappedByteBuffer 直接将文件写入SocketChannel。降低数据复制,提高性能。
总之反复可用的信息可以放在 Direct Buffer。
IoBuffer同意生成一个自己主动扩展的buffer,设置 AutoExpand属性实现,
IoBuffer buffer = IoBuffer.allocate(8);
buffer.setAutoExpand(true);
buffer.putString("12345678", encoder);
// Add more to this buffer
buffer.put((byte)10);
clear() : limit = capacity position = 0;重置 mark 。不清空数据,而是从头開始存放新的数据,相当于覆盖老数据。
reset():清空数据
remaining() :返回 limit - position的值。
hasRemaining() :推断当前是否有数据,返回position < limit 的boolean 值
六、优化指南。
1、mina能够指定使用 direct 或者 heap memory实现buffer池。1.X版本号须要自己设置
<span style="font-size:18px;">ByteBuffer.setUseDirectBuffers(false);
ByteBuffer.setAllocator(new SimpleByteBufferAllocator());</span>
2.x已经默认把直接内存分配改成堆。
2、将应用部署在linux上面而且打开 epoll 功能。
JDK6 已经默认打开,其它版本号能够通过參数打开。
Mina2 研究总结的更多相关文章
- 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...
- 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...
- 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...
- 闲来无聊,研究一下Web服务器 的源程序
web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...
- SQLSERVER聚集索引与非聚集索引的再次研究(上)
SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...
- 深入研究Visual studio 2017 RC新特性
在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...
- 【初码干货】使用阿里云对Web开发中的资源文件进行CDN加速的深入研究和实践
提示:阅读本文需提前了解的相关知识 1.阿里云(https://www.aliyun.com) 2.阿里云CDN(https://www.aliyun.com/product/cdn) 3.阿里云OS ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- SQLSERVER聚集索引与非聚集索引的再次研究(下)
SQLSERVER聚集索引与非聚集索引的再次研究(下) 上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 ...
随机推荐
- shell中判断用法
测试结构: 测试命令可用于测试表达式条件的真假,true,则返回0,false,则返回非0:这一点c/c++有区别: 格式: test expression #expression是一个 ...
- c++,extern “c”
C++中extern "C"的设立动机是实现C++与C及其它语言的混合编程. C++支持函数重载,而过程式语言C则不支持.函数被C++编译后在符号库中的名字与C语言的不同. 例如, ...
- ultraedit比较两个文件差异经验
链接地址:http://jingyan.baidu.com/article/fcb5aff7876551edab4a714b.html 程序开发人员经常要使用到两个文件的对比,有很多工具可以实现该功能 ...
- 关于C++异常机制的笔记(SEH, try-catch)
昨天晚上加班解决了一个问题,是由于无法正确的捕获到异常导致的.刚开始用try-catch,但是没法捕获到异常:后面改成SEH异常才解决.因此今天将这个问题重新梳理了一遍,关于try-catch, SE ...
- oracle 11g 11.2.0.1 设置HuagePage导致TRC 变大 变多
最近发现diag/..../trac/ 目录下 sid_ora_xxxx.trc 文件大小为11M 而且类似文件数量很大.导致占用了8G硬盘空间 另外个同事说他的DG没有这个问题. 都一样的系统和一 ...
- traceroute工作原理
traceroute, 也就是 trace route,跟踪路由.这个程序最早是Van Jacobson实现的.源代码在网上能够找到,只是我还没有去找.基本的原理是IP路由过程中对数据包TTL(T ...
- 高仿114la网址导航源码完整最新版
给大家本人我精心模仿的高仿114la网址导航源码,我们都知道114la网址导航的影响力,喜欢的朋友可以下载学习一下. 由于文件较大,没有上传了,下载地址在下面有的. 附源码下载: 114la网站导航 ...
- MSSQL - 备份和还原数据库
SQL语句备份和还原数据库:http://blog.csdn.net/liuhelong/article/details/3335687 1.MSSQL - SqlServer:此数据库处于单用户模式 ...
- 字符设备驱动[深入]:linux cdev详解
linux cdev详解 http://blog.chinaunix.net/uid-24517893-id-161446.html 用cdev_add添加字符设备驱动: //linux2.6中用c ...
- c语言,数组和指针
概要: 1.普通数组与指针 2.数组指针 3.指针的数组 数组是一个由(同一类型)连续元素组成的预先分配的内存块:指针是一个对任何位置的元素的引用. 数组自动分配空间,但不能重分配或改变大小:指针必须 ...