Java 中使用記憶體對映檔案需要考慮的 10 個問題

oschina發表於2013-11-18

  java中的記憶體對映IO和記憶體對映檔案是什麼?

  記憶體對映檔案非常特別,它允許Java程式直接從記憶體中讀取檔案內容,通過將整個或部分檔案對映到記憶體,由作業系統來處理載入請求和寫入檔案,應用只需要和記憶體大交道,這使得IO操作非常快。載入記憶體對映檔案所使用的記憶體在Java堆區之外。Java程式語言支援記憶體對映檔案,通過java.nio包和MappedByteBuffer 可以從記憶體直接讀寫檔案。

 記憶體對映的優缺點

  記憶體對映IO最大的優點可能在於效能,這對於建立高頻電子交易系統尤其重要。記憶體對映檔案通常比標準通過正常IO訪問檔案要快。另一個巨大的優勢是記憶體映 射IO允許載入不能直接訪問的潛在巨大檔案 。經驗表明,記憶體對映IO在大檔案處理方面效能更加優異。儘管它也有不足——增加了頁面錯誤的數目。由於作業系統只將一部分檔案載入到記憶體,如果一個請求 頁面沒有在記憶體中,它將導致頁面錯誤。同樣它可以被用來在兩個程式中共享資料。

 支援記憶體對映IO的作業系統

  大多數主流作業系統比如Windows平臺,UNIX,Solaris和其他類UNIX作業系統都支援記憶體對映IO和64位架構,你幾乎可以將所有檔案對映到記憶體並通過JAVA程式語言直接訪問。

 Java的記憶體對映IO的要點

  如下為一些你需要了解的java記憶體對映要點:

  1. java通過java.nio包來支援記憶體對映IO。
  2. 記憶體對映檔案主要效能敏感的應用,例如高頻電子交易平臺。
  3. 通過使用記憶體對映IO,你可以將大檔案載入到記憶體。
  4. 記憶體對映檔案可能導致頁面請求錯誤,如果請求頁面不在記憶體中的話。
  5. 對映檔案區域的能力取決於於記憶體定址的大小。在32位機器中,你不能訪問超過4GB或2 ^ 32(以上的檔案)。
  6. 記憶體對映IO比起Java中的IO流要快的多。
  7. 載入檔案所使用的記憶體是Java堆區之外,並駐留共享記憶體,允許兩個不同程式共享檔案。
  8. 記憶體對映檔案讀寫由作業系統完成,所以即使在將內容寫入記憶體後java程式崩潰了,它將仍然會將它寫入檔案直到作業系統恢復。
  9. 出於效能考慮,推薦使用直接位元組緩衝而不是非直接緩衝。
  10. 不要頻繁呼叫MappedByteBuffer.force()方法,這個方法意味著強制作業系統將記憶體中的內容寫入磁碟,所以如果你每次寫入記憶體對映檔案都呼叫force()方法,你將不會體會到使用對映位元組緩衝的好處,相反,它(的效能)將類似於磁碟IO的效能。
  11. 萬一發生了電源故障或主機故障,將會有很小的機率發生記憶體對映檔案沒有寫入到磁碟,這意味著你可能會丟失關鍵資料。

  好吧,小夥伴們,就是這些。記憶體對映IO是高階程式設計師特別是對於用Java編寫高效能應用的程式設計師來說是一個重要的概念。 如果你喜歡這些建議的話,你可以到我的部落格http://javarevisited.blogspot.com 來瀏覽更多類似文章。

  原文地址:10-Things-to-Know-about-Memory-Mapped-File-in-Java

相關文章