博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA NIO之Direct Buffer 与 Heap Buffer的区别?
阅读量:6110 次
发布时间:2019-06-21

本文共 1155 字,大约阅读时间需要 3 分钟。

hot3.png

个人总结

Direct Buffer  vs.  Heap Buffer
1、 劣势:创建和释放Direct Buffer的代价比Heap Buffer得要高;
2、 区别:Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAVA对象是归GC管理的,只要GC回收了它的JAVA对象,操作系统才会释放Direct Buffer所申请的空间),它似乎给人感觉是“内核缓冲区(buffer in kernel)”。Heap Buffer则是分配在堆上的,或者我们可以简单理解为Heap Buffer就是byte[]数组的一种封装形式,查看JAVA源代码实现,Heap Buffer也的确是这样。
3、 优势:当我们把一个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发送出去。

 

转载于:https://my.oschina.net/u/2381372/blog/1476329

你可能感兴趣的文章
JQuery-EasyUI Datagrid数据行鼠标悬停/离开事件(onMouseOver/onMouseOut)
查看>>
并发和并行的区别
查看>>
Java增强的for循环和普通for循环对比
查看>>
颜色渐变的算法
查看>>
第四次作业
查看>>
getLocation需要在app.json中声明permission字段,解决办法
查看>>
xtrabackup工具
查看>>
.NET下WPF学习之Socket通信
查看>>
【转载】APK反破解之一:Android Java混淆(ProGuard)
查看>>
安装SQL SERVER 2005 SP2后, IIS无法辨认SVC文件
查看>>
log4j配置后行号乱码显示为?问号
查看>>
HRBUST 1478 最长公共子序列的最小字典序
查看>>
MySQL所有函数及操作符
查看>>
常用快捷键
查看>>
js 四舍五入函数 toFixed(),小数位数精度
查看>>
正则表达式快速入门
查看>>
perference
查看>>
log4php使用及配置
查看>>
dataGridView加行标识方法与制作
查看>>
bzoj1079[SCOI2008]着色方案
查看>>