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创建和销毁的代价很高,所以要用在尽可能重用的地方

时间: 2024-10-04 04:12:29

Direct Buffer vs. Heap Buffer的相关文章

mysql sort buffer和join buffer学习笔记

相关参数查看命令 SELECT @@join_buffer_size; SELECT @@sort_buffer_size; ========================================================================================== join_buffer_size 当我们的join是ALL,index,rang或者Index_merge的时候使用的buffer. 实际上这种join被称为FULL JOIN. 实际上参与j

Ask Hoegh(5)——buffer cache和buffer有什么区别?

问: Oracle数据库的SGA包含db block buffer cache和redo buffer等组件,那么,同样属于内存,buffer cache和buffer有区别吗? 答:首先我们对比一下db block buffer cache和redo buffer的概念和功能. buffer cache,其中文名称为缓冲器高速缓冲存储器.按照oracle官方的说法,buffer cache就是一块含有许多数据块的内存区域,而这些数据块主要都是数据文件里的数据块内容的拷贝. 由于buffer c

CVE-2016-10191 FFmpeg RTMP Heap Buffer Overflow 漏洞分析及利用

作者:栈长@蚂蚁金服巴斯光年安全实验室 一.前言 FFmpeg是一个著名的处理音视频的开源项目,使用者众多.2016年末paulcher发现FFmpeg三个堆溢出漏洞分别为CVE-2016-10190.CVE-2016-10191以及CVE-2016-10192.网上对CVE-2016-10190已经有了很多分析文章,但是CVE-2016-10191尚未有其他人分析过.本文详细分析了CVE-2016-10191,是学习漏洞挖掘以及利用的一个非常不错的案例. 二.漏洞成因分析 在 RTMP协议中,

CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具.2016年末paulcher发现FFmpeg三个堆溢出漏洞分别为CVE-2016-10190.CVE-2016-10191以及CVE-2016-10192.本文对CVE-2016-10190进行了详细的分析,是一个学习如何利用堆溢出达到任意代码执行的一个非常不错的案例. 2. 漏洞分析 FFmpeg的 Http 协议的实现中支持几种不同的数据传输方式,通

Lucene5学习之Directory理解

Directory即Lucene中对索引目录的一个抽象,体现到API上,它被设计为一个抽象类,类里面定义了一些抽象方法,如listAll列出目录下所有文件,deleteFile(String name) 根据文件名称删除索引文件,这个都是文件的基本操作,其中比较重要的一个接口方法是makeLock,为什么要为索引目录加锁?其实就跟你上厕所为什么要锁门是一样一样滴?我没拉完你就给我乖乖等着.  BaseDirectory是Directory的一个子类,它默认实现了makeLock方法,   Jav

千丝万缕的FGC与Buffer pool

1 背景 运维通知,线上系统一直在FGC,通过zabbix查看GC 的次数 再查看YGC和FGC空间占用情况 这里有几个疑问: 1:old space 空间一直很低,为什么会有频繁的FGC? 2:Eden space 回收的阈值为什么越来越低,越来越频繁? 3:从Eden space空间看一直在YGC,但是从YGC的次数看并没有过YGC? 4:FGC的越来越频繁,到最后为什么一直在FGC? 第一个问题 通过查看打印出来的ERROR日志,确定是Direct buffer 不够.在申请DirectB

Netty buffer缓冲区ByteBuf

Netty buffer缓冲区ByteBuf byte 作为网络传输的基本单位,因此数据在网络中进行传输时需要将数据转换成byte进行传输.netty提供了专门的缓冲区byte生成api ByteBuf. Buffer API主要包括: ByteBuf ByteBufHolder Netty 缓冲 API 提供了几个优势: 可以自定义缓冲类型 通过一个内置的复合缓冲类型实现零拷贝 扩展性好,比如 StringBuilder 不需要调用 flip() 来切换读/写模式 读取和写入索引分开 方法链

Nodejs进阶:核心模块Buffer常用API使用总结

本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 Buffer是node的核心模块,开发者可以利用它来处理二进制数据,比如文件流的读写.网络请求数据的处理等. Buffer的API非常多,本文仅挑选 比较常用/容易理解 的API进行讲解,包括Buffer实例的创建.比较.连接.拷贝.查找.遍历.类型转换.截取.编码转换等. 创建 new Buffer(array) Buffer.alloc(length) Bu

node.js学习笔记(10) buffer

Pure JavaScript is Unicode-friendly but not nice to binary data. When dealing with TCP streams or the file system, it's necessary to handle octet streams. Node.js has several strategies for manipulating, creating, and consuming octet streams. Raw dat