Direct Buffer vs. Heap Buffer

一、 劣勢:建立和釋放Direct Buffer的代價比Heap Buffer得要高。 
二、 差異:Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAVA對象是歸GC管理的,只要GC回收了它的JAVA對象。操做系統纔會釋放Direct Buffer所申請的空間)。它彷佛給人感受是「內核緩衝區(buffer in kernel)」。Heap Buffer則是分配在堆上的,或者咱們可以簡單理解爲Heap Buffer就是byte[]數組的一種封裝形式,查看JAVA源碼實現,Heap Buffer也的確是這樣。 
三、 優點:當咱們把一個Direct Buffer寫入Channel的時候。就比如是「內核緩衝區」的內容直接寫入了Channel。這樣顯然快了,下降了數據拷貝(因爲咱們平時的read/write都是需要在I/O設備與應用程序空間之間的「內核緩衝區」中轉一下的)。而當咱們把一個Heap Buffer寫入Channel的時候,實際上底層實現會先構建一個暫時的Direct Buffer。而後把Heap Buffer的內容拷貝到這個暫時的Direct Buffer上。再把這個Direct Buffer寫出去。

固然,假設咱們屢次調用write方法。把一個Heap Buffer寫入Channel,底層實現可以反覆使用暫時的Direct Buffer,這樣不至於因爲頻繁地建立和銷燬Direct Buffer影響性能。 
簡單的說,咱們需要牢記三點: 
(1) 平時的read/write。都會在I/O設備與應用程序空間之間經歷一個「內核緩衝區」。數組

 
(2) Direct Buffer就比如是「內核緩衝區」上的緩存。不直接受GC管理;而Heap Buffer就不過byte[]字節數組的包裝形式。所以把一個Direct Buffer寫入一個Channel的速度要比把一個Heap Buffer寫入一個Channel的速度要快。 
(3) Direct Buffer建立和銷燬的代價很是高,因此要用在儘量重用的地方 緩存

相關文章
相關標籤/搜索