我编写了一些使用映射文件缓冲区的Posix程序。一个简单的场景是将一个1GB的文件映射到内存中,并用内容填满整个文件。
在程序执行期间,几乎没有磁盘IO操作,直到发生msync
或munmap
调用。
在完全相同的系统上,我用Oracle JDK 7编写了等效的Java程序,并注意到整个程序执行期间有大量的磁盘IO活动。
JVM中的内存映射文件缓冲区实现方式有何不同?是否有任何方法可以延迟大量的IO活动?
操作系统是Linux 3.2 x64。
代码:
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class Main {
public static void main(String[] args) throws Exception {
long size = 1024 * 1048576;
RandomAccessFile raf= new RandomAccessFile("mmap1g", "rw");
FileChannel fc = raf.getChannel();
MappedByteBuffer buf = fc.map(FileChannel.MapMode.READ_WRITE, 0, size);
for(long i = 0; i < size; ++i)
buf.put((byte)1);
}
}