位元組緩衝區分為直接位元組緩衝區與非直接位元組緩衝區 。
如果位元組緩衝區為直接位元組緩衝區, 則 jvm 會盡量在直接位元組緩 沖區上執行本機 i/o操作,也就是直接對核心空 間進行訪問,以提高執行效率 。 提高執行效率的原理就是在每次呼叫基於作業系統的 1/0 操作之前或之後, jvm 都會盡量避免將緩衝區的內容複製到中間緩衝區中,或者從中間緩衝區中複製內容,這樣就節省了乙個步驟 。
工廠方法 allocatedirect()可以建立直接位元組緩衝區,通過工廠方法 allocatedirect()返回的緩衝區進行記憶體的分配和釋放所需的時間成本通常要高於非直接緩衝區。直接緩衝區操作的資料不在 jvm 堆中 , 而是在核心空間中,根據這個結構可以分析出 ,直接緩 沖區善於儲存那些易受作業系統本機 1/0 操作影響的大量、 長時間儲存的資料 。
allocatedirect(int capacity)方法的作用:分配新的直接位元組緩衝區。新緩衝區的位置將為零 ,其界限將為其容量 , 其標記是不確定的 。 無論它是否具有底層實現陣列,其標記都是不確定的 。
allocate(int capacity)方法的作用 : 分配乙個新的非直接位元組緩衝區 。 新緩衝區的位置為零 ,其界限將為其容量,其標記是不確定的 。 它將具有乙個底層實現陣列,且其陣列偏移量將為零。
直接緩衝區會直接作用於本地作業系統的 i/o ,處理資料的效率相比非直接緩衝區會快一些
使用非直接緩衝區的測試**如下
public static void testallocate()
long endtime = system.currenttimemillis();
system.out.print("非直接緩衝區:"+(endtime - begintime));
}
使用直接緩衝區源**如下 :
public static void testallocatedirect()
long endtime = system.currenttimemillis();
system.out.println("直接緩衝區:"+(endtime - begintime));
}
結果如下:
從執行結果來看,直接緩衝區比非直接緩衝區在執行效率上要高一些,是什麼原因造成這樣的結果呢?直接緩衝區是使用 directbytebuffer 類進行實現的,而非直接緩衝區是使用 heapbytebuffer 類進行實現的 。 直接緩衝區的實現類 directbytebuffer 的 put(byte)方法的源**如下:
public bytebuffer put( byte x)
直接緩衝區( directbytebuffer)在內部使用 sun.misc.unsafe 類進行值的處理。 unsafe類的作用是 jvm 與作業系統進行直接通訊,提高程式執行的效率,但正如其類的名稱unsafe 一樣,該類在使用上並不是安全的,如果程式設計師使用不當,那麼極有可能出現處理資料上的錯誤,因此,該類並沒有公開化( public ),僅由 jdk 內部使用 。
而非直接緩衝區的實現類 heapbytebuffer 的 put(byte)方法的源**如下:
public bytebuffer put( byte x)
非直接緩衝區( heapbytebuffer)在內部直接對 byte口 hb 位元組陣列進行操作,而且還是在 jvm 的堆中進行資料處理,因此執行效率相對慢一些 。 輸入緩衝區與輸出緩衝區
本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...
nio學習01 緩衝區
緩衝區是包在乙個物件內的基本資料元素陣列。buffer類似相比乙個簡單的陣列優點是它將關於資料的資料內容和資訊包含在乙個單一的物件中。buffer類似及它專有的子類定義了乙個用於處理緩衝區的api。他的本質是一塊可以寫入資料,然後可以從中讀取資料的記憶體。這塊記憶體被包裝成nio物件,並提供了一組方...
IO模型 NIO緩衝區
緩衝區 buffer 緩衝區本質上是一塊可以寫入資料,然後可以從中讀取資料的記憶體 底層是陣列 這塊記憶體被包裝成nio buffer物件,並提供了一組方法,用來方便的訪問該塊記憶體。理解buffer的工作原理,需要熟悉它的三個屬性 capacity 容量,即可以容納的最大資料量 在緩衝區建立時被設...