當前位置:生活全書館 >

IT科技

> mmap java

mmap java

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

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)帶來的效能開銷。同時減少了資料在核心緩衝區和程序地址空間的拷貝次數。

java mmap

2、使用特殊檔案提供匿名記憶體對映。

3、使用shm_open以提供無親緣關係程序間的posix共享記憶體區。

mmap在Java中是如何使用的?(具體參考kafka原始碼中的OffsetIndex這個類)

操作檔案,就相當於操作一個ByteBuffer一樣。

public class TestMmap {undefinedpublic static String path = "C:Users64371Desktopmmap";public static void main(String[] args) throws IOException {undefinedFile file1 = new File(path, "1");RandomAccessFile randomAccessFile = new RandomAccessFile(file1, "rw");int len = 2048;// 對映為2kb,那麼生成的檔案也是2kbMappedByteBuffer 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) {undefinedCleaner cl = ((DirectBuffer)bb).cleaner();if (cl != null)cl.clean();}}

標籤: mmap java
  • 文章版權屬於文章作者所有,轉載請註明 https://shqsg.com/dianzi/41m299.html