Java 中使用記憶體對映檔案需要考慮的 10 個問題
java中的記憶體對映IO和記憶體對映檔案是什麼?
記憶體對映檔案非常特別,它允許Java程式直接從記憶體中讀取檔案內容,通過將整個或部分檔案對映到記憶體,由作業系統來處理載入請求和寫入檔案,應用只需要和記憶體大交道,這使得IO操作非常快。載入記憶體對映檔案所使用的記憶體在Java堆區之外。Java程式語言支援記憶體對映檔案,通過java.nio包和MappedByteBuffer 可以從記憶體直接讀寫檔案。
記憶體對映的優缺點
記憶體對映IO最大的優點可能在於效能,這對於建立高頻電子交易系統尤其重要。記憶體對映檔案通常比標準通過正常IO訪問檔案要快。另一個巨大的優勢是記憶體映 射IO允許載入不能直接訪問的潛在巨大檔案 。經驗表明,記憶體對映IO在大檔案處理方面效能更加優異。儘管它也有不足——增加了頁面錯誤的數目。由於作業系統只將一部分檔案載入到記憶體,如果一個請求 頁面沒有在記憶體中,它將導致頁面錯誤。同樣它可以被用來在兩個程式中共享資料。
支援記憶體對映IO的作業系統
大多數主流作業系統比如Windows平臺,UNIX,Solaris和其他類UNIX作業系統都支援記憶體對映IO和64位架構,你幾乎可以將所有檔案對映到記憶體並通過JAVA程式語言直接訪問。
Java的記憶體對映IO的要點
如下為一些你需要了解的java記憶體對映要點:
- java通過java.nio包來支援記憶體對映IO。
- 記憶體對映檔案主要效能敏感的應用,例如高頻電子交易平臺。
- 通過使用記憶體對映IO,你可以將大檔案載入到記憶體。
- 記憶體對映檔案可能導致頁面請求錯誤,如果請求頁面不在記憶體中的話。
- 對映檔案區域的能力取決於於記憶體定址的大小。在32位機器中,你不能訪問超過4GB或2 ^ 32(以上的檔案)。
- 記憶體對映IO比起Java中的IO流要快的多。
- 載入檔案所使用的記憶體是Java堆區之外,並駐留共享記憶體,允許兩個不同程式共享檔案。
- 記憶體對映檔案讀寫由作業系統完成,所以即使在將內容寫入記憶體後java程式崩潰了,它將仍然會將它寫入檔案直到作業系統恢復。
- 出於效能考慮,推薦使用直接位元組緩衝而不是非直接緩衝。
- 不要頻繁呼叫MappedByteBuffer.force()方法,這個方法意味著強制作業系統將記憶體中的內容寫入磁碟,所以如果你每次寫入記憶體對映檔案都呼叫force()方法,你將不會體會到使用對映位元組緩衝的好處,相反,它(的效能)將類似於磁碟IO的效能。
- 萬一發生了電源故障或主機故障,將會有很小的機率發生記憶體對映檔案沒有寫入到磁碟,這意味著你可能會丟失關鍵資料。
好吧,小夥伴們,就是這些。記憶體對映IO是高階程式設計師特別是對於用Java編寫高效能應用的程式設計師來說是一個重要的概念。 如果你喜歡這些建議的話,你可以到我的部落格http://javarevisited.blogspot.com 來瀏覽更多類似文章。
相關文章
- 使用記憶體對映檔案(mmap)記憶體
- Java使用記憶體對映實現大檔案的上傳Java記憶體
- Python mmap的使用-檔案記憶體對映Python記憶體
- 一個記憶體檔案對映使用者類 (轉)記憶體
- 記憶體對映檔案詳解-----C++實現(即一塊記憶體和一個檔案相對映對應)記憶體C++
- 選擇 NoSQL 資料庫需要考慮的 10 個問題SQL資料庫
- 資料遷移中需要考慮的問題
- VC++中用記憶體對映檔案 (轉)C++記憶體
- 二進位制檔案記憶體對映記憶體
- Java記憶體對映,上G大檔案輕鬆處理Java記憶體
- windows核心程式設計--記憶體對映檔案Windows程式設計記憶體
- 居然這就是C++記憶體對映檔案?!C++記憶體
- JAVA記憶體對映檔案實現多執行緒下載Java記憶體執行緒
- 記憶體對映記憶體
- 非同步日誌 vs. 記憶體對映檔案非同步記憶體
- C#記憶體對映大檔案並使用Marshal解析結構體資訊C#記憶體結構體
- Win 95下記憶體對映檔案的工作原理及使用方法 (轉)記憶體
- Rust 備受親睞? Chrome 考慮使用“新”方法解決記憶體安全問題RustChrome記憶體
- mmap記憶體對映記憶體
- 擁抱雲端計算之前需要考慮的9個問題
- Linux 記憶體管理:記憶體對映Linux記憶體
- 開發商更新應用之前需要考慮的五個問題
- 溫故之.NET程式間通訊——記憶體對映檔案記憶體
- C# .Net 多程式同步 通訊 共享記憶體 記憶體對映檔案 Memory MappedC#記憶體APP
- 排查Java的記憶體問題Java記憶體
- Cirium分析:航空公司需要重新考慮融資問題
- 好的精益工廠佈局需要考慮哪些問題?
- 論資料倉儲架構前需要考慮的問題架構
- 重構模式(三)---- 應用 Refactoring 需要考慮的問題模式
- 【IPC程式間通訊之三】記憶體對映檔案Mapping FileC程式記憶體APP
- 關於java吃記憶體的問題Java記憶體
- 請教一個java程式記憶體釋放的問題Java記憶體
- 面試題:JVM在Java堆中對物件的建立、記憶體結構、訪問方式面試題JVMJava物件記憶體
- MySQL中需要考慮的一些工具MySql
- 機器學習實際應用中必須考慮到的9個問題機器學習
- Java中讀取檔案6種記憶體安全方式Java記憶體
- 2.5.11.2 FORCE LOGGING 模式需要考慮的效能問題模式
- 關於dataWithContentsOfFile 讀取大檔案的記憶體問題記憶體