1. 程式人生 > >NIO學習筆記,從Linux IO演化模型到Netty—— Java NIO零拷貝

NIO學習筆記,從Linux IO演化模型到Netty—— Java NIO零拷貝

同樣只是大致上的認識。

其中,當使用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方法讀寫資料,那就要求在訪問期間物件的記憶體地址不