JAVA NIO之Direct Buffer 与 Heap Buffer的区别?
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框架中:
- 在读取channel里面的数据流的时候,netty默认是用直接内存,也就是新建一个Direct Buffer,之后再去用它来接受将要读取的数据。
- 在需要发送数据出去的时候,需要往channel里面写数据。netty会判断业务层传递过来的数据是不是直接内存,如果是heap buffer的话,netty会转化为直接内存,再传递给channel发送出去。
转载于:https://my.oschina.net/u/2381372/blog/1476329
JAVA NIO之Direct Buffer 与 Heap Buffer的区别?相关推荐
- Java NIO系列教程(五)Buffer
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.交互图如下: 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被 ...
- Java NIO系列教程(三) Buffer
2019独角兽企业重金招聘Python工程师标准>>> Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本 ...
- Java NIO:Buffer、Channel 和 Selector
Buffer 一个 Buffer 本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据. java.nio 定义了以下几个 Buffer 的实现,这个图读者应该也在不少地方见过了吧 ...
- Java NIO基础之缓冲区buffer(笔记 day01)
学习笔记,仅供参考,禁止搬运,如有不正确的地方欢迎大家指正,谢谢!!! 一.缓冲区buffer 代码 package com.lihefei.nio.day01; import org.junit. ...
- 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 ...
- 三、Java NIO 编程
3.1.Java NIO 基本介绍 Java NIO 全称java non-blocking IO,是指JDK提供的新API.从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为 ...
- Java NIO系列教程(十二) Java NIO与IO
原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html 作者:Jakob Jenkov 译者:郭蕾 校对:方腾飞 当学习了Java ...
- Java NIO之Channel(通道)
**Java高级特性增强-NIO 本部分网络上有大量的资源可以参考,在这里做了部分整理并做了部分勘误,感谢前辈的付出,每节文章末尾有引用列表~ 写在所有文字的前面:作者在此特别推荐Google排名第一 ...
- Java NIO、NIO.2学习笔记
http://www.cnblogs.com/littlehann/p/3720396.html 相关学习资料 http://www.molotang.com/articles/903.html ...
最新文章
- 透明物体分割学习笔记
- C++ Primer 5th笔记(chap 15 OOP)继承中的类作用域
- 通过js引用外部脚本(方便直接在浏览器上调试抓取代码)
- CentOS7安装mysql8并配置
- Cisco路由器IOS映像恢复及升级方法
- JQuery全选反选 随其他checkbox自动勾选全选反选
- WdatePicker日期插件
- html微软雅黑字体模糊,如何解决WinXP下微软雅黑字体不清晰的问题
- sql判断时间大于0点_Java秒杀系统实战系列-数据库级别Sql的优化与代码的调整
- [asp.net]自定义控件(数据绑定)
- Java Jar 包反编译
- 图书馆图书管理系统python_使用python的简易图书馆管理系统
- AI 大数据在数据隐私保护下如何普惠共享?CCF TF「联邦学习」研讨会给出了答案
- 使用 Cloudreve 快速搭建一个强大的个人云盘
- LumaQQ启动脚本
- 手机用的网络和计算机用的网络一样吗,终于懂了手机用电脑的网络上网
- android电视分辨率是多少合适,电视分辨率多少合适,目前口碑最好的电视机推荐...
- 服务器虚拟化 硬件分区 电气隔离,HPE Integrity BL860c i6
- This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the foll
- linux跑到命令行是到了哪里,在Linux命令行中使用tcpdump「超详细」
热门文章
- 第九届国际冬季脑机接口会议(BCI2021)
- bs4爬取的时候有两个标签相同_4.4 爬虫中的bs4数据爬取步骤
- 芯片巨人也要搞医疗?
- SpaceX再送4人上太空,马斯克保证这次飞船厕所不会漏了
- 苹果AirTag遭破解,网友放出“教程”,可重写程序,可能成为恶意跟踪“神器”...
- OPPO这次的新旗舰,开始“搞颜色”了,当然不是外壳的那种
- 我从GitHub上看到了编程语言八年变迁史 | Reddit 30.7k
- 中国AI创业公司霸榜NeurIPS-AutoDL竞赛,冠军代码已开源
- 孙正义的软银愿景宫斗内幕:印度裔高管争宠,黑公关手段,设局桃色仙人跳...
- 首次证明:牵手就能同步脑电波,还能缓解疼痛