1. 程式人生 > >java NIO buffer --directBuffer (2)

java NIO buffer --directBuffer (2)

然而 一個 ddr 聯系 調用 設備 數據 直接 回收

HeapBuffer ----堆緩沖 :其實是在java 的內存模型中,java 虛擬機可以直接管控的

DirectBuffer ---直接緩沖 :使用的是native ,與操作系統掛鉤,調用的是c 或者c++ 的代碼,不在java 的內存模型中,我們稱為堆外內存,因為不屬於java 內存模型,所以java 虛擬機管控不到; 但是 address 維護了堆外內存的引用 (在buffer 類中維護者 long address)

那麽問題來了,為什麽不直接用HeapBuffer 操作,反而 使用DirectBuffer 還引入了一個不在java 內存模型的堆外內存呢?

顯而易見,為了效率,使用 HeapBuffer

會多了一次數據COPY 的過程,多了一步他會將java 內存模型的數據copy 到java 內存模型之外的與操作系統相關的一塊內存中(為啥要copy 呢?主要是為了防止gc 的回收,所以再copy 一份 ),然後才有I/O設備發生聯系

然而使用DirectBuffer ,真正的數據已經在基於操作系統的堆外放著,數據的讀寫直接與堆外的內存打交道,少了一次數據的讀寫過程,實現了zero copy (零copy)

java NIO buffer --directBuffer (2)