Atitit.病毒木馬的快速擴散機制原理nio 內存映射MappedByteBufferhtml
1. Java NIO(New Input/Output)1java
1.1. 變動通知(由於每一個事件都須要一個監聽者)2程序員
1.4. 內存映射——好鋼用在刀刃上2oracle
4. ref4學習
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
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的另外一特色是它對於應用程序的表現力的關注,這個咱們會在下面的練習中看到。
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)
由上表可知,傳統IO方式平均拷貝完成時間約爲1968ms,NIO文件通道方式平均拷貝完成時間約爲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倍以上的性能提高。
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