首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 使用內存映射文件實現大文件高效上傳

     編輯:Java 相關知識

傳統 IO 與內存映射性能對比

測試文件大小 1,253,244 字節,分別使用三種方式讀取並累加字節值:

讀取方式耗時說明
FileInputStream.read()1464 ms單字節讀取,系統調用開銷極大
BufferedInputStream.read()72 ms帶緩衝區,減少系統調用次數
MappedByteBuffer25 ms內存映射,直接操作內存區域

若去除累加運算僅測試讀取循環,差距更明顯:1458 ms / 67 ms / 8 ms。

核心代碼實現

// 內存映射文件讀取
MappedByteBuffer buffer = new RandomAccessFile(file, "rw")
        .getChannel()
        .map(FileChannel.MapMode.READ_WRITE, 0, file.length());

// 直接遍歷內存區域
for (int i = 0; i < file.length(); i++) {
    byte b = buffer.get(i);
    // 處理數據...
}

原理解析

  1. 內存映射機制:將文件直接映射到進程虛擬地址空間的一段連續內存區域,由操作系統負責頁面調度。
  2. 零拷貝優勢:省去用戶態與內核態之間的數據拷貝,減少上下文切換。
  3. 適合場景:大文件頻繁隨機讀寫、多進程共享文件、需高性能解析二進制格式。

注意事項

  • 映射大小受限於進程虛擬地址空間(32 位 JVM 約 1.5-2GB),大文件需分段映射。
  • 修改內容會自動同步回磁盤,但同步時機由 OS 決定,關鍵數據可調用 force() 強制刷新。
  • 映射文件佔用堆外內存,不受 -Xmx 限制,但計入進程 RSS,需監控物理內存使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved