在java NIO中,有两种不同的buffer:direct buffer和non-direct buffer。所谓direct buffer,就是指直接在底层分配的缓存(比如操作系统内核缓存),而non-direct buffer就是在java堆中分配的缓存,即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影响性能。
如果我们构造一个ByteBuffer仅仅使用一次,不复用它,那么Direct Buffer和Heap Buffer没有明显的区别。两个地方我们可能通过Direct Buffer来提高性能:
1、 大文件,尽管我们Direct Buffer只用一次,但是如果内容很大,Heap Buffer的复制代价会很高,此时用Direct Buffer能提高性能。这就是为什么,当我们下载一个大文件时,服务端除了用SendFile机制,也可以用“内存映射”,把大文件映射到内存,也就是 MappedByteBuffer,是一种Direct Buffer,然后把这个MappedByteBuffer直接写入SocketChannel,这样减少了数据复制,从而提高了性能。
2、 重复使用的数据,比如HTTP的错误信息,例如404呀,这些信息是每次请求,响应数据都一样的,那么我们可以把这些固定的信息预先存放在Direct Buffer中(当然部分修改Direct Buffer中的信息也可以,重要的是Direct Buffer要能被重复使用),这样把Direct Buffer直接写入SocketChannel就比写入Heap Buffer要快了。
简单的说,我们需要牢记三点:
(1) 平时的read/write,都会在I/O设备与应用程序空间之间经历一个“内核缓冲区”。
(2) Direct Buffer就好比是“内核缓冲区”上的缓存,不直接受GC管理;而Heap Buffer就仅仅是byte[]字节数组的包装形式。因此把一个Direct Buffer写入一个Channel的速度要比把一个Heap Buffer写入一个Channel的速度要快。
(3) Direct Buffer创建和销毁的代价很高,所以要用在尽可能重用的地方。
相关推荐
本方法是基于BIOES标注的,如果为其它,请...B-PL E-PL B-ZZ E-ZZ B-SJ I-SJ E-SJ 经过BERT分词器分词后为: 反 复 胸 痛 15 年 这时候label就要重新修复下偏移了,修复后结果如下: B-PL E-PL B-ZZ E-ZZ B-SJ E-SJ
基于国家标准的endnote的输出样式,适用于学生党论文插入文献参考,较为方便。endnote论文神器。
SOT23;N—Channel沟道,30V;6.5A;RDS(ON)=30mΩ@VGS=10V,VGS=20V;Vth=1.2~2.2V;
SOT23;N—Channel沟道,30V;6.5A;RDS(ON)=30mΩ@VGS=10V,VGS=20V;Vth=1.2~2.2V;
Profibus上位机监控程序,查看PLC的各种变量信息
凯旋网络供求信息网源码ASP版 诚优科技qq302913876
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
程序文件目录 "序号 "编号 "程序文件名称 "备注 " "1 "ZZ/CX01-10 "《保证公正性和诚实性程序》 "4.1.5 d) " "2 "ZZ/CX02-10 "《保护客户机密信息和所有权控制程序》 "4.1.5 c) " "3 "ZZ/CX03-10 "《质量监督管理...
ZZ-2021030 网络搭建与应用赛项赛卷《网络环境》.pdf
zz1165935664-BLab-master_zzk3686_pcb_esp8266电路_esp8266电路板_模块pcb.
zz1165935664-BLab-master_zzk3686_pcb_esp8266电路_esp8266电路板_模块pcb_源码.zip
atguigu_springboot2_zz-master.zip
android应用源码zz-doctor中医大夫助理信息系统
P&G笔试测试题ZZ.doc---word文档版
ZZ-2022004 建筑CAD赛项赛题 中职赛项 适合正在准备技能大赛的人群
ZZ-2022010 机器人技术应用赛项赛题 中职赛项 适合正在准备技能大赛的人群
应用广泛的嵌入式操作系统——ZZ-Linux.pdf
对于传统的 FizzBuzz 问题 - 整数从 1 到 100 - 它的运行速度比基于循环的方法略快,但速度优势非常快。 该函数将播放 FizzBuzz 的整数作为输入,并输出包含 'fizz'、'buzz'、'fizzbuzz' 或相应整数的元胞...
ZZ-2022022 汽车机电维修赛项赛题 中职赛项 适合正在准备技能大赛的人群