优化指南
MINA默认配置的性能并不是很高的,部分原因是MINA目前还保留初期版本的架构,另外一个原因是因为JVM的发展。

首先我们关闭默认的ThreadModel设置

IoAcceptor acceptor = ...; IoServiceConfig acceptorConfig = acceptor.getDefaultConfig(); acceptorConfig.setThreadModel(ThreadModel.MANUAL);

ThreadModel是一个很简单的线程实现,用于IoService。但是它实在太弱,以至于在并发环境产生大量问题。在MINA 2.0中,ThreadModel直接被取消。你应该使用ExecutorFilter来实现线程。

然后我们增加I/O处理线程(Article by Sparkle)
每一个Acceptor/Connector都使用一个线程来处理连接,然后把连接发送给I/O processor进行读写操作,我们只可以修改I/O processor使用的线程数,用以下代码设置

IoAcceptor acceptor = new SocketAcceptor(Runtime.getRuntime().availableProcessors() + 1, Executors.newCachedThreadPool());

当然是要将ExecutorFilter加入,上文已经很详细地描述了

acceptor.getDefaultConfig().getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool());

笔者在开发过程中,多次遇到OutOfMemoryError,经过研究之后才发现原因。MINA默认是使用direct memory实现ByteBuffer池的方案(以下简称direct buffer),通过JNI在内存开辟一段空间来使用,该方案在早期的MINA版本中是一个非常好的特性,那是因为MINA开发初期,JVM并没有现在的 强大,带有池效果的direct buffer性能比较好。但是当我们使用-Xms -Xmx等指令增加JVM可使用的内存,那仅仅增加了堆的内存空间,而direct memory的空间并没有增加,导致MINA实际使用的时候经常出现OutOfMemoryError。如果你的确想使用direct memory,可以通过-XX:MaxDirectMemorySize选项来设置。不过笔者不建议这样做,因为最新的测试表明,在现代的JVM里 面,direct memory比堆的表现更差。这里可能有读者会觉得奇怪,为什么不用池,而要用堆呢,而且还需要gc。那是因为现在的JVM gc能力已经很强了,而且在并发环境里面,pool的同步也是一个性能的问题。我们可以通过这样的代码进行设置(Article by Sparkle)

ByteBuffer.setUseDirectBuffers(false); ByteBuffer.setAllocator(new SimpleByteBufferAllocator());

MINA 2.0已经默认把直接内存分配改成堆,为了提供最好的性能和稳定性。

最后一条优化技巧就是,把你的应用部署在Linux上,并且打开Java NIO使用Linux epoll的功能。可能你还没听过epoll,但是你应该听过Lighttpd、Nginx、Squid等,得益于epoll,它们提供很高的网络性能, 还占用非常少的系统资源。JDK6已经默认把epoll配置打开,因此笔者建议把你的应用部署在JDK6上面,也同时因为JDK6还有别的优化特性。如果 你的应用必须部署在JDK5上,你也可以通过参数把epoll支持打开。

基于MINA构建简单高性能的NIO应用-优化指南相关推荐

  1. 网络|基于Netty构建的高性能车辆网项目实现(一)

    本文主要做技术分享,如有侵权请通知作者删除 项目背景 该项目是d市的政府项目,需要从n(n>10000)台公交车中收集车上数据,包括驱动.电池.发动机.报警等共计100余种车辆信息,需要基于国标 ...

  2. 网络安全公司奇安信集团是如何基于 Flink 构建 CEP 引擎实时检测网络攻击【未来不可忽视的网络安全】

    摘要: 奇安信集团作为一家网络安全公司是如何基于 Flink 构建 CEP 引擎实时检测网络攻击?其中面临的挑战以及宝贵的实践经验有哪些?本文主要内容分为以下四个方面: 背景及现状 技术架构 产品及运 ...

  3. 基于gradle构建spring cloud项目

    构建环境 idea:2021.1.2 gradle:4.10.3 项目介绍 gradle-spring-cloud 根项目,用于统一一些公共配置 gradle-eurakeserver 模块使用eur ...

  4. 基于Mina实现的一个简单数据采集中间件

    一.前言 该数据据采集中间件需要实现与多个终端的长连接,并定时给所有终端发送指令,终端在接收到相关指令后,返回相关信息给中间件.中间件需要一直监测所有终端的在线状态,并一直监听.接收所有终端的消息,并 ...

  5. 基于CentOS构建高性能的LAMP平台

    基于CentOS构建高性能的LAMP平台 大纲: 一.系统 安装 二.编译安装基本环境 三.配置虚拟主机及基本性能调优 四.基本安全设置 五.附录及相关介绍 一.系统安装 1. 分区    /boot ...

  6. 基于ForkJoin构建一个简单易用的并发组件

    2019独角兽企业重金招聘Python工程师标准>>> 基于ForkJoin构建一个简单易用的并发组件 在实际的业务开发中,需要用到并发编程的知识,实际使用线程池来异步执行任务的场景 ...

  7. 基于 MINA 的 TLS/SSL NIO Socket 实现(二)

    转自:http://blog.sina.com.cn/s/blog_9f2dd2f3010165cq.html MinaSocketApache.netSecurity  功能:1) 客户端首先必须以 ...

  8. java mina性能_高性能Java网络框架 MINA

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络 ...

  9. 如何基于 K8s 构建下一代 DevOps 平台?

    作者 | 孙健波(天元) 导读:当前云原生 DevOps 体系现状如何?面临哪些挑战?如何通过 OAM 解决云原生 DevOps 场景下的诸多问题?云原生开发应用模型 OAM(Open Applica ...

最新文章

  1. ORACLE如何使用DBMS_METADATA.GET_DDL获取DDL语句
  2. c编程:输入一个数字n,则n代表n行,每行输入2个数字a,b计算每行的a+b问题。
  3. Visual Studio LightSwitch初体验和定位看法
  4. oschina压缩工具
  5. 凸优化第四章凸优化问题 4.2 凸优化
  6. CPU瓶颈(五)--过度编译与不必要重复编译的解决方案
  7. 微软超融合私有云测试02-测试架构描述
  8. 算法常用术语中英对照
  9. paypal 支付接口开发--Java版
  10. java生成图表_【JAVA】POI生成EXCEL图表(柱状图、折线等)
  11. Drupal8 自定义主题开发实战记录
  12. OCCT v11.0.16 x64 电脑硬件检测烤鸡软件中文
  13. 01336软件项目管理复习
  14. MachineLearning in Action (机器学习实战)源码和数据集下载地址
  15. UVA live3713
  16. 【机器学习基础】贝叶斯神经网络
  17. logging日志管理
  18. 转行产品经理必须要知道的三件事!
  19. Java中如何实现数组反转,将数组元素倒过来排列?【含详细解析】
  20. AfterShip陈龙生:如何把SaaS做成一门好生意?

热门文章

  1. 性能测试之二——性能测试的流程
  2. 6 redis 编译失败_Redis(NoSQL数据库)基础篇
  3. ajax servlet怎么接收_【百战程序员从开始到植发】之AJAX
  4. linux en_us支持什么格式的中文,更改Linux操作系统下的显示默认支持语言
  5. idea messages中文乱码_2019.2版本IDEA控制台中文乱码尝试了很多方法都不行
  6. linux修改java占用端口号_Linux端口被占用、查看
  7. oracle11g设置数据库归档,oracle_Oracle11g RAC开启关闭、设置归档小结,关闭 1.先关数据库: 复制代 - phpStudy...
  8. linux logcat阻塞,同时使用logcat的在Linux中
  9. mysql alter例子,mysql alter语句用法实例
  10. jquery 手型 鼠标穿过时_三模无线搭配对称手型设计,游戏致胜利器,ROG烈刃2无线鼠标...