2019独角兽企业重金招聘Python工程师标准>>>

个人总结
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

JAVA NIO之Direct Buffer 与 Heap Buffer的区别?相关推荐

  1. Java NIO系列教程(五)Buffer

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.交互图如下: 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被 ...

  2. Java NIO系列教程(三) Buffer

    2019独角兽企业重金招聘Python工程师标准>>> Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本 ...

  3. Java NIO:Buffer、Channel 和 Selector

    Buffer 一个 Buffer 本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据. java.nio 定义了以下几个 Buffer 的实现,这个图读者应该也在不少地方见过了吧 ...

  4. Java NIO基础之缓冲区buffer(笔记 day01)

    学习笔记,仅供参考,禁止搬运,如有不正确的地方欢迎大家指正,谢谢!!! 一.缓冲区buffer  代码 package com.lihefei.nio.day01; import org.junit. ...

  5. It's all about buffers: zero-copy, mmap and Java NIO

    2019独角兽企业重金招聘Python工程师标准>>> Sep 10, 2016 in OS There are use cases where data need to be re ...

  6. 三、Java NIO 编程

    3.1.Java NIO 基本介绍 Java NIO 全称java non-blocking IO,是指JDK提供的新API.从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为 ...

  7. Java NIO系列教程(十二) Java NIO与IO

    原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html 作者:Jakob Jenkov   译者:郭蕾    校对:方腾飞 当学习了Java ...

  8. Java NIO之Channel(通道)

    **Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每节文章末尾有引用列表~ 写在所有文字的前面:作者在此特别推荐Google排名第一 ...

  9. Java NIO、NIO.2学习笔记

    http://www.cnblogs.com/littlehann/p/3720396.html 相关学习资料   http://www.molotang.com/articles/903.html ...

最新文章

  1. js浮点数精度丢失问题及如何解决js中浮点数计算不精准
  2. job kettle 导出_kettle从hive2导出数据正常,但是用kettle manager启动就报错
  3. Java培训总结:过滤器链的实现方法、配置和案例分析
  4. JVM-内存溢出场景模拟
  5. ASP.NET字符显示不正确的解决方法
  6. iOS 抓包工具限免,速度下载!【附使用教程】
  7. 数字图像处理基本知识点1(冈萨雷斯)
  8. adobe acrobat pro dc 无法打开PDF_pdf怎样转成word格式
  9. OSChina 周一乱弹 —— 我当你是朋友,你却……
  10. 文件关联注册表项都有哪些?
  11. 极限编程-拥抱变化阅读感想(二)
  12. 关闭腾讯网迷你版(登录qq后的广告弹窗)
  13. 执行董事和CEO有什么区别
  14. 柯尔特python_柯字取名的含义是什么
  15. Python 列表(list)
  16. nyoj 203 三国志 dijkstra+01背包
  17. CockroachDB架构——CockroachDB中的读和写
  18. 腾讯qq珊瑚虫版_12年来第二次更新:这个版本的QQ你还用吗
  19. 噪声对比估计NCE (Noise-contrastive estimation)采样方法,提高训练速度,解决源码中正label个数必须相等问题
  20. 微信小程序向系统日历添加事件(提醒)实现

热门文章

  1. 脑电分析系列[MNE-Python-8]| 参考电极简介
  2. 在动作观察,运动想象和站立和坐姿执行过程中解码脑电节律
  3. 搜集了一些模型,精模低模都有
  4. 小冰公司CEO李笛:AI不会江郎才尽,创造力只会持续向上攀升丨MEET2022
  5. 砸下数百万美元分析CEO语气,这帮投资者用AI发现了比财报更多的细节
  6. 她琴棋书画全能,还进入清华计算机系实验室,被赞智商太超群、能力过强悍...
  7. 2021年第一天,腾讯给青年科学家的300万大红包又来了
  8. 没用上5G的One World演唱会,视频会议软件Zoom和思科WebEX立功了
  9. 美国汽车协会实测:行人检测系统都是渣渣,包括特斯拉
  10. 【linux kernel】 中断处理-中断下半部【转】