在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创建和销毁的代价很高,所以要用在尽可能重用的地方。
相关推荐
### K2980ZZ-TR-E-VB N-Channel沟道SOT23 MOSFET晶体管参数介绍与应用说明 #### 概述 K2980ZZ-TR-E-VB是一款高性能N-Channel沟道MOSFET(金属氧化物半导体场效应晶体管),采用SOT23封装形式。这款MOSFET具有低导...
根据给定的信息,本文将详细解析“2SK2980ZZ-TR-E-VB”这款SOT23封装N-Channel场效应MOS管的关键技术特性与应用领域。 ### 一、产品概述 2SK2980ZZ-TR-E-VB是一款采用SOT23封装的N-Channel沟道MOSFET(金属氧化物...
标题中的"Profibus.rar_Profibus-DP-zz_profibus_profibus-dp_profibus上位机_tca"表明这是一个与Profibus通信协议相关的资源压缩包,特别是关于Profibus-DP子系统,以及可能用于上位机监控的工具或库。描述提到的...
本方法是基于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
【标题】"zz-deprecated-wunder-java2"指的是一个针对官方Wunderlist API的Java库,主要用于帮助开发者在Java环境中与Wunderlist服务进行交互。"deprecated"这个词表明这个库可能已经不再推荐使用,可能有更新的替代...
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
ZZ-2021030 网络搭建与应用赛项赛卷《网络环境》.pdf
《SpringBoot2深度解析——基于atguigu_springboot2_zz-master项目实践》 SpringBoot作为现代化Java开发的重要框架,极大地简化了Spring应用的初始搭建以及开发过程。本篇文章将深入探讨基于`atguigu_springboot2_...
基于国家标准的endnote的输出样式,适用于学生党论文插入文献参考,较为方便。endnote论文神器。
《中医大夫助理信息系统 zz-doctor 深度解析》 中医大夫助理信息系统“zz-doctor”是一款基于Android平台的应用程序,旨在为中医医生提供智能化、便捷化的诊疗辅助工具。通过深入剖析这款应用的源码,我们可以了解...
zz1165935664-BLab-master_zzk3686_pcb_esp8266电路_esp8266电路板_模块pcb_源码.zip
ZZ-B-225B.027815.zip
《Dinapoli ZZ (ZigZag) - MetaTrader 4 脚本解析》 在金融市场中,交易者常常需要借助各种技术工具来分析市场趋势,以便做出明智的投资决策。Dinapoli ZZ (ZigZag) 指标就是其中的一种,它是一种在 MetaTrader 4 ...
标题中的“zz1165935664-BLab-master_zzk3686_pcb_esp8266电路_esp8266电路板_模块pcb”暗示了这是一个关于电子工程项目的资源,特别是与ESP8266微控制器相关的电路板设计。ESP8266是一款经济实惠且功能强大的Wi-Fi...
应用广泛的嵌入式操作系统——ZZ-Linux.pdf
这个赛题,即“ZZ-2022010 机器人技术应用赛项”,是针对这一目标而设立的竞赛项目。 赛题通常涵盖以下几个核心知识点: 1. **机器人基础知识**:参赛者需要了解机器人的基本构成,包括机械结构、电子元件、传感器...
对于传统的 FizzBuzz 问题 - 整数从 1 到 100 - 它的运行速度比基于循环的方法略快,但速度优势非常快。 该函数将播放 FizzBuzz 的整数作为输入,并输出包含 'fizz'、'buzz'、'fizzbuzz' 或相应整数的元胞...
ZZ-2022004 建筑CAD赛项赛题 中职赛项 适合正在准备技能大赛的人群
《ZZ Fibo Trader - MetaTrader 5 EA 深度解析》 ZZ Fibo Trader 是一款专为 MetaTrader 5(MT5)平台设计的自动交易专家顾问(EA),其核心在于结合了斐波那契回调线分析和抛物线止损系统,为交易者提供了智能化的...