NIO學習筆記,從Linux IO演化模型到Netty—— Java NIO零拷貝
阿新 • • 發佈:2020-02-25
同樣只是大致上的認識。
其中,當使用transferFrom,transferTo的時候用的sendfile()。
如果系統核心不支援 sendfile,進一步執行 transferToTrustedChannel() 方法,以 mmap 的零拷貝方式進行記憶體對映,這種情況下目的通道必須是 FileChannelImpl 或者 SelChImpl 型別。
如果以上兩步都失敗了,則執行 transferToArbitraryChannel() 方法,基於傳統的 I/O 方式完成讀寫,具體步驟是初始化一個臨時的 DirectBuffer,將源通道 FileChannel 的資料讀取到 DirectBuffer,再寫入目的通道。
MappedByteBuffer 使用是堆外的虛擬記憶體。
DirectByteBuffer 是 MappedByteBuffer 的具體實現類,也具有檔案記憶體對映的功能,分配的是堆外使用者空間的記憶體。
HeapByteBuffer的資料在 GC 時可能會被自動回收。因此,在使用 HeapBuffer 讀寫資料時,為了避免緩衝區資料因為 GC 而丟失,NIO 會先把 HeapBuffer 內部的資料拷貝到一個臨時的 DirectBuffer。
在JVM的垃圾回收器裡,除了CMS,都是需要移動物件,如果要通過native方法讀寫資料,那就要求在訪問期間物件的記憶體地址不