理解Java Direct Buffer

ByteBuffer

java nio 包引入了 ByteBuffer類,代表字節緩存。

HeapByteBuffer

HeapByteBuffer的內存在Java堆中分配,實際上是堆byte[]的封裝。
創建HeapByteBuffer:

ByteBuffer heapByteBuffer = ByteBuffer.allocate(1024);

DirectByteBuffer

DirectByteBuffer申請Java堆外內存來緩存字節數組,由於所申請的內存空間不受Java垃圾回收器的管理,所以稱之爲“直接內存”。
創建DirectByteBuffer:

ByteBuffer heapByteBuffer = ByteBuffer.allocateDirect(1024);

爲什麼需要DirectBuffer

Java堆小知識:
Java垃圾回收器在整理Java堆時,會改變對象存儲的地址,所以Java堆內對象的地址可能會改變。

操作系統IO小知識:
操作系統在執行IO操作時,從指定地址開始讀/寫內存,並且在IO操作期間,內存地址不能變動。

由於Java垃圾回收會改變對象地址,所以對應的內存無法直接用於系統IO,因此如果使用的是堆內存,Java在執行IO之前,需要複製堆內存到直接內存,再執行IO,這個內存複製操作會影響執行效率。

直接內存的作用:
使用直接內存,操作系統IO可以直接操作直接內存,無需執行復制。

直接內存的分配很昂貴

Java的堆內存,在啓動時已經分配好,所以在程序中分配較快。

而直接內存則需要通過malloc等系統調用來申請,因此內存分配會較慢。

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