Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer

Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBufferhtml

 

1Java NIO(New Input/Output)1java

1.1. 变动通知(由于每一个事件都须要一个监听者)2程序员

1.2. 选择器和异步IO:经过选择器来提升多路复用2编程

1.3. 通道——承诺与现实2api

1.4. 内存映射——好钢用在刀刃上2oracle

1.5. 字符编码和搜索2app

2MappedByteBuffer3异步

3性能提高对比4性能

4ref4学习

 

 

1. Java NIO(New Input/Output)

NIO之因此比java.io更加高效,是由于NIO面向的是data chunks,而java.io基本上是面向byte的。

——新的输入/输出API包——是2002年引入到J2SE 1.4里的。Java NIO的目标是提升Java平台上的I/O密集型任务的性能。过了十年,不少Java开发者仍是不知道怎么充分利用NIO,更少的人知道在Java SE 7里引入了更新的输入/输出 API(NIO.2)。这篇教程展现了5个在Java编程的一些常见场景里使用NIO和NIO.2包的简单示例。

NIO和NIO.2对于Java平台最大的贡献是提升了Java应用开发中的一个核心组件的性能:输入/输出处理。不过这两个包都不是很好用,而且它们也不是适用于全部的场景。若是可以正确地使用的话,Java NIO和NIO.2能够大大减小一些经常使用I/O操做所花的时间。这就是NIO和NIO.2所具备的超能力,我会在这篇文章里向你展现5种使用它们的简单方式。

为了进一步挖掘NIO的能力,我又改用MappedByteBuffer执行测试,这个类是构建在操做系统的虚拟内存机制上的。根据java文档所说,这个类在性能方面是最好的

 

做者::  (attilax)>>> 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

 

1.1. 变动通知(由于每一个事件都须要一个监听者)

1.2. 选择器和异步IO:经过选择器来提升多路复用

1.3. 通道——承诺与现实

1.4. 内存映射——好钢用在刀刃上

1.5. 字符编码和搜索

NIO的背景

为何一个已经存在10年的加强包仍是Java的新I/O包呢?缘由是对于大多数的Java程序员而言,基本的I/O操做都可以胜任。在平常工做中,大部分的Java开发者没有必要去学习NIO。更进一步,NIO不只仅是一个性能提高包。相反,它是一个和Java I/O相关的不一样功能的集合。NIO经过使得Java应用的性能“更加接近实质”来达到性能提高的效果,也就是意味着NIO和NIO.2的API暴露了低层次的系统操做的入口。NIO的代价就是它在提供更强大的I/O控制能力的同时,也要求咱们比使用基本的I/O编程更加细心地使用和练习。NIO的另外一特色是它对于应用程序的表现力的关注,这个咱们会在下面的练习中看到。

2. MappedByteBuffer

 

java处理大文件,通常用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过若是文件超大的话,更快的方式是采用MappedByteBuffer

 MappedByteBuffer是java nio引入的文件内存映射方案,读写性能极高。NIO最主要的就是实现了对异步操做的支持。其中一种经过把一个套接字通道(SocketChannel)注册到一个选择器(Selector)中,不时调用后者的选择(select)方法就能返回知足的选择键(SelectionKey),键中包含了SOCKET事件信息。这就是select模型。
    SocketChannel的读写是经过一个类叫ByteBuffer(java.nio.ByteBuffer)来操做的.这个类自己的设计是不错的,比直接操做byte[]方便多了. ByteBuffer有两种模式:直接/间接.间接模式最典型(也只有这么一种)的就是HeapByteBuffer,即操做堆内存 (byte[]).可是内存毕竟有限,若是我要发送一个1G的文件怎么办?不可能真的去分配1G的内存.这时就必须使用"直接"模式,即 MappedByteBuffer,文件映射.
     先中断一下,谈谈操做系统的内存管理.通常操做系统的内存分两部分:物理内存;虚拟内存.虚拟内存通常使用的是页面映像文件,即硬盘中的某个(某些)特殊的文件.操做系统负责页面文件内容的读写,这个过程叫"页面中断/切换". MappedByteBuffer也是相似的,你能够把整个文件(无论文件有多大)当作是一个ByteBuffer.MappedByteBuffer 只是一种特殊的 ByteBuffer ,便是ByteBuffer的子类。 MappedByteBuffer 将文件直接映射到内存(这里的内存指的是虚拟内存,并非物理内存)。一般,能够映射整个文件,若是文件比较大的话能够分段进行映射,只要指定文件的那个部分就能够。

三种方式:
              FileChannel提供了map方法来把文件影射为内存映像文件: MappedByteBuffer map(int mode,long position,long size); 能够把文件的从position开始的size大小的区域映射为内存映像文件,mode指出了 可访问该内存映像文件的方式:READ_ONLY,READ_WRITE,PRIVATE.                    
a. READ_ONLY,(只读): 试图修改获得的缓冲区将致使抛出 ReadOnlyBufferException.(MapMode.READ_ONLY)
 b. READ_WRITE(读/写): 对获得的缓冲区的更改最终将传播到文件;该更改对映射到同一文件的其余程序不必定是可见的。 (MapMode.READ_WRITE)
c. PRIVATE(专用): 对获得的缓冲区的更改不会传播到文件,而且该更改对映射到同一文件的其余程序也不是可见的;相反,会建立缓冲区已修改部分的专用副本。 (MapMode.PRIVATE)

 

3. 性能提高对比

         由上表可知,传统IO方式平均拷贝完成时间约为1968msNIO文件通道方式平均拷贝完成时间约为1672ms,文件内存映射及文件通道方式平均拷贝完成时间约为1418ms

接下来,调用每种方法插入100,000条记录耗时对好比下:
    * With java.io: ~10,000 milliseconds
    * With java.nio: ~2,000 milliseconds
    * With MappedByteBuffer: ~970 milliseconds


使用NIO的性能改善效果很是明显,使用MappedByteBuffer的性能,更是让人吃惊。

使用三种方式读取数据的性能对好比下:
    * With java.io: ~6,900 milliseconds
    * With java.nio: ~1,400 milliseconds
    * With MappedByteBuffer: ~355 milliseconds

和写入的时候状况差很少,NIO有很明显的性能提高,而MappedByteBuffer则有惊人的高效率。从java.io迁移到nio并使用MappedByteBuffer,一般能够得到10倍以上的性能提高。

 

4. ref

5种调优Java NIO和NIO.2的方式 - 李克华 - 博客园.html

NIO.2 入门,第 1 部分_ 异步通道 API.html

Java IO和Java NIO在文件拷贝上的性能差别分析 - OPEN 开发经验库.html

java.io和java.nio性能简单对比 - 飞鸟Blog - 博客频道 - CSDN.NET.html

相关文章
相关标签/搜索