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 ...
最新文章
- js浮点数精度丢失问题及如何解决js中浮点数计算不精准
- job kettle 导出_kettle从hive2导出数据正常,但是用kettle manager启动就报错
- Java培训总结:过滤器链的实现方法、配置和案例分析
- JVM-内存溢出场景模拟
- ASP.NET字符显示不正确的解决方法
- iOS 抓包工具限免,速度下载!【附使用教程】
- 数字图像处理基本知识点1(冈萨雷斯)
- adobe acrobat pro dc 无法打开PDF_pdf怎样转成word格式
- OSChina 周一乱弹 —— 我当你是朋友,你却……
- 文件关联注册表项都有哪些?
- 极限编程-拥抱变化阅读感想(二)
- 关闭腾讯网迷你版(登录qq后的广告弹窗)
- 执行董事和CEO有什么区别
- 柯尔特python_柯字取名的含义是什么
- Python 列表(list)
- nyoj 203 三国志 dijkstra+01背包
- CockroachDB架构——CockroachDB中的读和写
- 腾讯qq珊瑚虫版_12年来第二次更新:这个版本的QQ你还用吗
- 噪声对比估计NCE (Noise-contrastive estimation)采样方法,提高训练速度,解决源码中正label个数必须相等问题
- 微信小程序向系统日历添加事件(提醒)实现
热门文章
- 脑电分析系列[MNE-Python-8]| 参考电极简介
- 在动作观察,运动想象和站立和坐姿执行过程中解码脑电节律
- 搜集了一些模型,精模低模都有
- 小冰公司CEO李笛:AI不会江郎才尽,创造力只会持续向上攀升丨MEET2022
- 砸下数百万美元分析CEO语气,这帮投资者用AI发现了比财报更多的细节
- 她琴棋书画全能,还进入清华计算机系实验室,被赞智商太超群、能力过强悍...
- 2021年第一天,腾讯给青年科学家的300万大红包又来了
- 没用上5G的One World演唱会,视频会议软件Zoom和思科WebEX立功了
- 美国汽车协会实测:行人检测系统都是渣渣,包括特斯拉
- 【linux kernel】 中断处理-中断下半部【转】