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. 透明物体分割学习笔记
  2. C++ Primer 5th笔记(chap 15 OOP)继承中的类作用域
  3. 通过js引用外部脚本(方便直接在浏览器上调试抓取代码)
  4. CentOS7安装mysql8并配置
  5. Cisco路由器IOS映像恢复及升级方法
  6. JQuery全选反选 随其他checkbox自动勾选全选反选
  7. WdatePicker日期插件
  8. html微软雅黑字体模糊,如何解决WinXP下微软雅黑字体不清晰的问题
  9. sql判断时间大于0点_Java秒杀系统实战系列-数据库级别Sql的优化与代码的调整
  10. [asp.net]自定义控件(数据绑定)
  11. Java Jar 包反编译
  12. 图书馆图书管理系统python_使用python的简易图书馆管理系统
  13. AI 大数据在数据隐私保护下如何普惠共享?CCF TF「联邦学习」研讨会给出了答案
  14. 使用 Cloudreve 快速搭建一个强大的个人云盘
  15. LumaQQ启动脚本
  16. 手机用的网络和计算机用的网络一样吗,终于懂了手机用电脑的网络上网
  17. android电视分辨率是多少合适,电视分辨率多少合适,目前口碑最好的电视机推荐...
  18. 服务器虚拟化 硬件分区 电气隔离,HPE Integrity BL860c i6
  19. This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the foll
  20. linux跑到命令行是到了哪里,在Linux命令行中使用tcpdump「超详细」

热门文章

  1. 第九届国际冬季脑机接口会议(BCI2021)
  2. bs4爬取的时候有两个标签相同_4.4 爬虫中的bs4数据爬取步骤
  3. 芯片巨人也要搞医疗?
  4. SpaceX再送4人上太空,马斯克保证这次飞船厕所不会漏了
  5. 苹果AirTag遭破解,网友放出“教程”,可重写程序,可能成为恶意跟踪“神器”...
  6. OPPO这次的新旗舰,开始“搞颜色”了,当然不是外壳的那种
  7. 我从GitHub上看到了编程语言八年变迁史 | Reddit 30.7k
  8. 中国AI创业公司霸榜NeurIPS-AutoDL竞赛,冠军代码已开源
  9. 孙正义的软银愿景宫斗内幕:印度裔高管争宠,黑公关手段,设局桃色仙人跳...
  10. 首次证明:牵手就能同步脑电波,还能缓解疼痛