我的总结
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框架中:缓存