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


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

     

    1Java NIO(New Input/Output)1

    1.1. 变更通知(因为每个事件都需要一个监听者)2

    1.2. 选择器和异步IO:通过选择器来提高多路复用2

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

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

    1.5. 字符编码和搜索2

    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://www.cnblogs.com/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

  • 相关阅读:
    表单控件和属性
    html5语义化标签
    移动布局
    webpack
    OMobile
    Npm的下载 安装 管理工具
    模块化开发
    百度地图
    离线缓存
    canvas和svg
  • 原文地址:https://www.cnblogs.com/attilax/p/5316832.html
Copyright © 2020-2023  润新知