java NIO(九) 緩衝區——字節緩衝區&&直接緩衝區


字節緩衝區,顧名思義“緩衝”對象是字節,但是字節緩衝區又是一個特殊的緩衝區,因爲字節是操作系統及其IO設備使用的基本數據類型。

字節緩衝區和其他緩衝區最明顯的區別在於,他們可以成爲通道所執行的IO的源頭和目標。通道只接收ByteBuffer作爲參數。

直接緩衝區:

在jvm中,字節數組可能不會在內存中連續存儲,或者無用存儲單元收集可能隨時對其進行移動。在java中,數組是對象,而數據存儲在對象中

的方式在不同的jvm實現中各有不同。處於這個原因,引入了直接緩衝區的概念。直接緩衝區被用於與通道和固有IO例程交互。他們通過使用

固有代碼來告知操作系統直接釋放或者填充內存區域。

直接緩衝區通常是IO的最好選擇。非直接緩衝區可以被傳遞給通道,但是這樣可能導致性能損耗。通常非直接緩衝不可能成爲一個本地IO操作

的目標,如果向一個通道中傳遞一個非直接ByteBuffer對象用於寫入,通道可能每次在調用中隱含的進行下面的操作:

1、創建一個臨時的直接ByteBuffer對象;

2、將非直接緩衝區中的內容複製到臨時緩衝中;

3、使用臨時緩衝執行低層次的IO;

4、臨時緩衝區對象離開作用域,並最終成爲被回收的無用數據;

這可能導致緩衝區在每個IO上覆制併產生大量對象,這是我們極力避免的。

直接緩衝區是IO的最佳選擇,但可能創建直接緩衝區要花費更高的成本。直接緩衝區使用的內存是通過調用native method分配的,繞過了jvm。

通過allocateDirect產生直接緩衝區。

java6對於allocateDirect的幫助文檔是:

public static ByteBuffer allocateDirect(int capacity)分配新的直接字節緩衝區。 
新緩衝區的位置將爲零,其界限將爲其容量,其標記是不確定的。無論它是否具有底層實現數組,其標記都是不確定的。 

參數:
capacity - 新緩衝區的容量,以字節爲單位 
返回:
新的字節緩衝區 
拋出: 
IllegalArgumentException - 如果 capacity 爲負整數


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章