java mmap是什么,讓我們一起了解一下?
mmap是將一個文件或者其它對象映射進內存,文件被映射到多個頁上,如果文件的大小不是所有頁的大小之和,最后一個頁不被使用的空間將會清零。mmap在用戶空間映射調用系統中作用很大。
目前Java提供的mmap只有內存文件映射,其他IO操作還沒有內存映射功能。
Java內存映射文件(Memory Mapped Files)就已經在java.nio包中,但它對很多程序開發者來說仍然是一個相當新的概念。引入NIO后,Java IO已經相當快,而且內存映射文件提供了Java有可能達到的最快IO操作,這也是為什么那些高性能Java應用應該使用內存映射文件來持久化數據。
mmap在Java中的用途是什么?
1、對普通文件使用mmap提供內存映射I/O,以避免系統調用(read、write、lseek)帶來的性能開銷。同時減少了數據在內核緩沖區和進程地址空間的拷貝次數。
2、使用特殊文件提供匿名內存映射。
3、使用shm_open以提供無親緣關系進程間的Posix共享內存區。
mmap在Java中是如何使用的?(具體參考kafka源碼中的OffsetIndex這個類)
操作文件,就相當于操作一個ByteBuffer一樣。
public?class?TestMmap?{undefined public?static?String?path?=?"C:\\Users\\64371\\Desktop\\mmap"; public?static?void?main(String[]?args)?throws?IOException?{undefined File?file1?=?new?File(path,?"1"); RandomAccessFile?randomAccessFile?=?new?RandomAccessFile(file1,?"rw"); int?len?=?2048; //?映射為2kb,那么生成的文件也是2kb MappedByteBuffer?mmap?=?randomAccessFile.getChannel().map(FileChannel.MapMode.READ_WRITE,?0,?len); System.out.println(mmap.isReadOnly()); System.out.println(mmap.position()); System.out.println(mmap.limit()); //?寫數據之后,JVM?退出之后會強制刷新的 mmap.put("a".getBytes()); mmap.put("b".getBytes()); mmap.put("c".getBytes()); mmap.put("d".getBytes()); //?System.out.println(mmap.position()); //?System.out.println(mmap.limit()); // //?mmap.force(); //?參考OffsetIndex強制回收已經分配的mmap,不必等到下次GC, unmap(mmap); //?在Windows上需要執行unmap(mmap);?否則報錯 //?Windows?won't?let?us?modify?the?file?length?while?the?file?is?mmapped //?java.io.IOException:?請求的操作無法在使用用戶映射區域打開的文件上執行 randomAccessFile.setLength(len/2); mmap?=?randomAccessFile.getChannel().map(FileChannel.MapMode.READ_WRITE,?0,?len/2); //?A?mapping,?once?established,?is?not?dependent?upon?the?file?channel //?that?was?used?to?create?it.?Closing?the?channel,?in?particular,?has?no //?effect?upon?the?validity?of?the?mapping. randomAccessFile.close(); mmap.put(128,?"z".getBytes()[0]); } //?copy?from?FileChannelImpl#unmap(私有方法) private?static?void?unmap(MappedByteBuffer?bb)?{undefined Cleaner?cl?=?((DirectBuffer)bb).cleaner(); if?(cl?!=?null) cl.clean(); } }
以上就是小編今天的分享了,希望可以幫助到大家。