JAVA NIO之Direct Buffer 與 Heap Buffer的區別?

我的總結
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框架中:緩存

  1. 在讀取channel裏面的數據流的時候,netty默認是用直接內存,也就是新建一個Direct Buffer,以後再去用它來接受將要讀取的數據。 
  2. 在須要發送數據出去的時候,須要往channel裏面寫數據。netty會判斷業務層傳遞過來的數據是否是直接內存,若是是heap buffer的話,netty會轉化爲直接內存,再傳遞給channel發送出去。

 

相關文章
相關標籤/搜索