我的總結
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建立和銷燬的代價很高,因此要用在儘量重用的地方。數組
在netty框架中:緩存