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等系統調用來申請,因此內存分配會較慢。