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建立和销毁的代价很是高,因此要用在尽量重用的地方 缓存

相关文章
相关标签/搜索