前些日了,对AIO与NIO的并发性能进行了比较,在低并发的情况下,NIO性能表现比AIO好一些,主要原因是,NIO中可以使用FileChannel.transferTo(long position, long count, WritableByteChannel target),这个方法可以对传输文件数据有很大的性能提升。

在AIO中,没办法使用FileChannel.transferTo(...),只能使用ByteBuffer来做中转,我一开始使用的ByteBuffer.allocate(16 * 1024),也就是16KB的缓存区。

由于上面的原因,所以NIO在不是很高的并发情况下,性能比AIO表现的好一些。

昨天,我还写了一篇文章:AsynchronousFileChannel 使用的默认线程池的疑问

今天早上,我试着将ByteBuffer由原来固定的16KB,更改为一个与传输的文件大小有关的字节缓存区。

相关代码如下:

//如果文件大小<1M,直接返回一个 fileSize + headerSize
 //如果文件大小>=1M,直接返回一个(fileSize + headerSize) / 2, 也就是最多保证分两次传输完数据
 private ByteBuffer allocateByteBuffer(int fileSize, int headerSize)
 {
  if(fileSize < 1024 * 1024)
  {
   return ByteBuffer.allocate(fileSize + headerSize);
  }
  else
  {
   return ByteBuffer.allocate((fileSize + headerSize) / 2 + 1); //这所以 +1, 因为 11 / 2 = 5,为了保证两次传完, + 1 可保证这一点
  }
 }

然后经过测试发现,在低并发情况下,性能上升了很多,终于赶上了NIO的性能,同时观察“任务管理器”中的进程使用的线程数也下降了很多,真是一举两得,这让我兴奋了好一会儿,

经过冷静的分析,我得出的结论:

之所以将ByteBuffer的大小设置为与传输的文件大小有关的缓存区后性能得到了很大的提升,主要与AIO的“写操作”有关。

举个例子:

在AIO的“写操作”中,如果我们设置ByteBuffer为一个固定的16KB的缓存区,当我们传输一个160KB的文件时,AIO的“写操作”需要执行10次“回调”。每1次的回调都是在系统默认的一个线程池中运行的,回调的次数与线程池中的线程数是成正比的。

如是我们将ByteBuffer设置为160KB,在进行AIO的“写操作”时,系统只执行了一次“回调”,回调的次数减少了,线程池的容量也不再需要那么多了,性能同时也上升了。

不过,经过测试也发现,ByteBuffer的容量也不能无限制的根据文件大小一设置,如果一个文件超过1M,还是最好设置为最大不超过1M的缓存区比较好,因为测试发现,如果设置一个很大的缓存区,比如5M,在高并发的时候,系统内存会很快用完,直接抛出: OutOfMemoryError

-------------------------------------------------------------------------------------------------

AIO进程占用的线程数与文件IO和网络IO有非常大的关系,当高并发的时候,网络IO达到瓶颈,这个时候很多任务都没有完成(正在完成中),占用的线程自然就会不断的上升。

2012-07-10

Java: 扩大字节缓存区的大小,提升AIO的处理性能(并发性能)的更多相关文章

  1. java输入输出 -- java NIO之缓存区Buffer

    一.简介 java NIO相关类在jdk1.4被引入,用于提高I/O的效率.java NIO包含很多东西,但核心的东西不外乎Buffer.channel和selector.本文先来看Buffer的实现 ...

  2. Java开发笔记(九十三)深入理解字节缓存

    前面介绍了文件通道的读写操作,其中用到字节缓存ByteBuffer,它是位于通道内部的存储空间,也是通道唯一可用的存储形式.ByteBuffer有两种构建方式,一种是调用静态方法wrap,根据输入的字 ...

  3. 文件分片 浏览器文件大小限制 自定义请求头 在一个资源的加载进度停止之后被触发 arrayBuffer 异步 二进制数据缓存区

    js 整数限制 浏览器文件大小限制 https://w3c.github.io/FileAPI/#dom-blob-arraybuffer https://developer.mozilla.org/ ...

  4. 按字节读取txt文件缓存区大小设置多少比较好?

    读取 txt 文件常规写法有逐行读取和按照字节缓存读取,那么按照字节缓存读取时,设置缓存区多大比较好呢?百度了一下,没发现有说这个问题的,自测了一把,以事实说话. 常规读取方法如下: // 字节流读取 ...

  5. JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder

    JAVA之旅(十七)--StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder 讲完String,我们来聊聊他的小兄弟 一.StringB ...

  6. IntelliJ IDEA修改Output输出缓存区大小【应对:too much output to process】

    IntelliJ IDEA默认的Output输出缓存区大小只有1024KB,超过大小限制的就会被清除,而且还会显示[too much output to process],可通过如下配置界面进行修改O ...

  7. Java NIO------基础理论之缓存区

    1.概述:NIO我的理解就是 New IO,是API1.4里提供的新的API,为所有的原始类型做缓存支持. NIO主要的核心组成部分: Buffer(缓存) Channels(通道) Selector ...

  8. 【MINA】缓存区ByteBuffer和IOBuffer你要了解的常用知识

    mina中IOBuffer是Nio中ByteBuffer的衍生类,主要是解决Bytebuffer的两个不足 1.没有提供足够灵活的get/putXXX方法 2.它容量固定,难以写入可变长度的数据 特点 ...

  9. 如何计算Java对象所占内存的大小

    [ 简单总结: 随便一个java项目,引入jar包: lucene-core-4.0.0.jar 如果是 maven项目,直接用如下依赖: <dependency> <groupId ...

随机推荐

  1. 20155318 《网络攻防》Exp2 后门原理与实践

    20155318 <网络攻防>Exp2 后门原理与实践 基础问题回答 例举你能想到的一个后门进入到你系统中的可能方式? 下载软件前要勾选一些用户协议,其中部分就存在后门进入系统的安全隐患. ...

  2. EZ 2018 05 06 NOIP2018 慈溪中学集训队互测(五)

    享受爆零的快感 老叶本来是让初三的打的,然后我SB的去凑热闹了 TM的T2写炸了(去你妹的优化),T1连-1的分都忘记判了,T3理所当然的不会 光荣革命啊! T1 思维图论题,CHJ dalao给出了 ...

  3. EZ 2018 03 16 NOIP2018 模拟赛(四)

    链接:http://211.140.156.254:2333/contest/64 我去掉了一百多分! 这次的题目怎么说呢,特别水,但是就是出现了一些很逗的错误导致炸裂. 最好笑的是SB的不只我一个: ...

  4. 《FPGA设计技巧与案例开发详解-第二版》全套资料包

    本人参与写的一本书(TimeQuest一章由我所写),希望大家多多支持: 全书配套资料上传各大网盘资料中附送大量源码,你值得拥有--<FPGA设计技巧与案例开发详解-第二版>全套资料包-V ...

  5. Qt 的线程与事件循环

    Qt 的线程与事件循环

  6. mybatis源码-解析配置文件(一)之XML的DOM解析方式

    目录 简介 Java 中 XML 文件解析 解析方式 DOM 解析 XML 新建 XML 文件 DOM 操作相关类 Java 读取 XML 文件 一起学 mybatis @ 简介 在之前的文章< ...

  7. JavaScript快速入门-ECMAScript本地对象(String)

    一.String对象 String对象和python中的字符串一样,也有很多方法,这些方法大概分为以下种类: 1.索引和查找 1.charAt()   返回指定位置的字符. 2.charCodeAt( ...

  8. 写个发邮件的功能php的(全代码)

    ---恢复内容开始--- 正好做了个项目,需要在线留言,一般在线留言发邮件是很常见的方式,一开始从网上搜了很久都没有很全的,也有全一点的,但是也不能用,运行不成功,下面给大家分享一下运行成功了的全部代 ...

  9. jenkis +sonarqube 对后端代码静态扫描,钉钉群通知执行结果(记录)

    代码提交,触发后端sonar测试,测试完成,jenkins触发依赖任务,执行python脚本,达到预期,调用上线任务模块,进行上线,达不到预期,钉钉群通知. 牵涉到配置: 1.配置sonar测试任务 ...

  10. python3绝对路径,相对路径

    from __future__ import absolute_import的作用: 直观地看就是说”加入绝对引入这个新特性”.说到绝对引入,当然就会想到相对引入.那么什么是相对引入呢?比如说,你的包 ...