java 内存文件_Java内存映射文件(Memory Mapped Files)
Java內存映射文件(Memory Mapped Files)
什么是Java內存映射文件/IO
內存映射文件是一種允許Java程序直接從內存訪問的特殊文件。通過將整個文件或者文件的一部分映射到內存中、操作系統負責獲取頁面請求和寫入文件,應用程序就只需要處理內存數據,這樣可以實現非常快速的IO操作。用于內存映射文件的內存在Java的堆空間以外。Java中的java.nio包支持內存映射文件,可以使用MappedByteBuffer來讀寫內存。
內存映射文件的優缺點
可能內存映射IO的主要優勢是性能,內存映射文件比通過普通的IO來訪問文件要快,這對于繁忙的電子交易系統來說非常重要。內存映射IO另外一個優勢是能夠加載普通方式無法訪問的大文件,實驗表明內存映射IO在大文件處理中表現得更好;但缺點是有增加頁面錯誤(page fault)的可能,因為操作系統僅僅加載一部分文件到內存中,如果被請求的頁面不在內存中那就會導致一個頁面錯誤。大多數主流操作系統如Windows, Unix, Solaris和其他類Unix的操作系統都支持內存映射IO,在64位架構下,你幾乎可以將任何文件映射到內存中并直接使用Java訪問。另外一個優勢是這些文件能夠共享,在進程間提供共享內存,而且比普通的基于loopback接口的Socket要快10倍。
Java中MappedByteBuffer讀寫樣例
下面的例子演示了如何使用內存映射文件來讀寫。我們使用RandomAccessFile打開文件并使用FileChannel的map()方法將它映射到內存,map()方法有三個輸入參數:mode, position, size。返回值MappedByteBuffer是用來處理內存映射文件的字節緩存。
package com.rocketmq;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class MemoryMappedFileInJava {
private static int count = 10485760; // 10 MB
public static void main(String[] args) throws Exception {
RandomAccessFile memoryMappedFile = new RandomAccessFile("largeFile.txt", "rw");
// Mapping a file into memory
MappedByteBuffer out = memoryMappedFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, count);
// Writing into Memory Mapped File
for (int i = 0; i < count; i++) {
out.put((byte) 'A');
}
System.out.println("Writing to Memory Mapped File is completed");
// reading from memory file in Java
for (int i = 0; i < 10; i++) {
System.out.print((char) out.get(i));
}
System.out.println("Reading from Memory Mapped File is completed");
memoryMappedFile.close();
}
}
總結
下面快速總結一下Java內存映射文件和IO
1). Java語言通過java.nio包支持內存映射文件和IO。
2). 內存映射文件用于對性能要求高的系統中,如繁忙的電子交易系統
3). 使用內存映射IO你可以將文件的一部分加載到內存中
4). 如果被請求的頁面不在內存中,內存映射文件會導致頁面錯誤
5). 將一個文件區間映射到內存中的能力取決于內存的可尋址范圍。在32位機器中,不能超過4GB,即2^32比特。
6). Java中的內存映射文件比流IO要快(譯注:對于大文件而言是對的,小文件則未必)
7). 用于加載文件的內存在Java的堆內存之外,存在于共享內存中,允許兩個不同進程訪問文件。順便說一下,這依賴于你用的是direct還是non-direct字節緩存。
8). 讀寫內存映射文件是操作系統來負責的,因此,即使你的Java程序在寫入內存后就掛掉了,只要操作系統工作正常,數據就會寫入磁盤。
9). Direct字節緩存比non-direct字節緩存性能要好
10). 不要經常調用MappedByteBuffer.force()方法,這個方法強制操作系統將內存中的內容寫入硬盤,所以如果你在每次寫內存映射文件后都調用force()方法,你就不能真正從內存映射文件中獲益,而是跟disk IO差不多。
11). 如果電源故障或者主機癱瘓,有可能內存映射文件還沒有寫入磁盤,意味著可能會丟失一些關鍵數據。
12). MappedByteBuffer和文件映射在緩存被GC之前都是有效的。sun.misc.Cleaner可能是清除內存映射文件的唯一選擇。
=============END=============
總結
以上是生活随笔為你收集整理的java 内存文件_Java内存映射文件(Memory Mapped Files)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装win2008R2系统并激活
- 下一篇: 详述人工智能在自动驾驶中的应用