天天看點

mappedByteBuffer和ByteBuffer的特色

先了解實體記憶體、虛拟記憶體、頁面檔案、交換區

實體記憶體,顧名思義,就是實實在在存在的那個東西,插在你電腦主機闆上的記憶體條所提供的空間。
頁面檔案,這個是硬碟上的一塊空間,在Windows下表現為一個檔案。這個頁面檔案存在的意義就是在實體    記憶體被占用滿以後,将實體記憶體中的東西移動到硬碟上的這個空間,騰出實體記憶體給需要的應用程式來使用。
交換區,這個是實體記憶體和頁面檔案空間的總和,“交換”的含義,則是指在硬碟檔案、CPU和其它IO之間進行資料的傳遞和暫存(這句話對于了解計算機運作基本流程的人來說應該可以了解)。
虛拟記憶體:這裡暫時了解為虛拟機記憶體,在系統之上的記憶體
           

讀取檔案流程

old IO :ByteBuffer資料要多次拷貝;先從頁面檔案–>實體記憶體(堆外記憶體)–>堆記憶體(虛拟機)–>操作

NIO:old IO :ByteBuffer從頁面檔案–>實體記憶體(堆外記憶體)–>操作

mappedByteBuffer:從頁面檔案–>實體記憶體(堆外記憶體)–>操作

這裡也可以知道NIO的性能也很不錯.但是在不考慮記憶體占用的情況下,一次性讀取入記憶體的mappedByteBuffer會比NIO還要快些.

部分總結:

1.MappedByteBuffer使用虛拟記憶體,是以配置設定(map)的記憶體大小不受JVM的-Xmx參數限制,但是也是有大小限制的。

2.如果當檔案超出1.5G限制時,可以通過position參數重新map檔案後面的内容。

3.MappedByteBuffer在處理大檔案時的确性能很高,但也存在一些問題,如記憶體占用、檔案關閉不确定,被其打開的檔案隻有在垃圾回收的才會被關閉,而且這個時間點是不确定的。
javadoc中也提到:A mapped byte buffer and the file mapping that it represents remain valid until the buffer itself is garbage-collected.*