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-23 00:20:59

Direct Buffer vs. Heap Buffer的相关文章

C语言错误: CRT detected that the application wrote to memory after end of heap buffer

CRT detected that the application wrote to memory after end of heap buffer 多是中间对其进行了一些操作,在程序结束处,释放内存的时候,引起错误: HEAP CORRUPTION DETECTED:after Normal block(#***) at 0x****.CRT detected that application wrote memory after end of heap buffer. 错误原因: 以对内在操

CRT detected that the application wrote to memory after end of heap buffer.

很多人的解释都不一样,  我碰到的问题是,开辟的内存空间小于操作的内存空间.也就是说,我free的内存越界了. 这是我开辟链表结构体内存的代码: 1 PNODE Create() { 2 int len; //total count of nodes to be created. 3 int i; 4 int val; //temp value for the current node. 5 printf("enter the size of nodes:"); 6 scanf(&qu

SQL Server 环形缓冲区(Ring Buffer) -- RING BUFFER CONNECTIVITY 的深入理解

SQL Server 环形缓冲区(Ring Buffer) -- RING BUFFER CONNECTIVITY 的深入理解 首先我们从连接的Ring Buffer数据返回的XML来入手. SELECT CAST(record as xml) AS record_data FROM sys.dm_os_ring_buffers WHERE ring_buffer_type= 'RING_BUFFER_CONNECTIVITY' 执行上面的语句,得到下面的结果: 点击XML的超链接,打开文件内容

(转!)Z buffer和W buffer简介

几乎所有目前的 3D 显示芯片都有 Z buffer 或 W buffer.不过,还是常常可以看到有人对 Z buffer 和 W buffer 有一些基本的问题,像是 Z buffer 的用途.Z buffer 和 W buffer 的差别.或是一些精确度上的问题等等.这篇文章的目的就是要简单介绍一下 Z buffer 和 W buffer. Z buffer 和 W buffer 是做什么用的呢?它们的主要目的,就是去除隐藏面,也就是 Hidden surface elimination(或

[vs执行报错] CRT detected that the application wrote to memory after end of heap buffer

CRT 是c/c++ run-time lib , 是程序执行时所需的核心库. 这个错误是由于以对内在操作的过程中.所写的地址超出了.所分配内在的边界 有个建议是: 1.内存申请多少释放多少,释放掉你申请过的内存,不要乱释放. 2.不能释放已经释放的内存.

[vs运行报错] CRT detected that the application wrote to memory after end of heap buffer

CRT 是c/c++ run-time lib , 是程序运行时所需的核心库. 这个错误是因为以对内在操作的过程中,所写的地址超出了,所分配内在的边界 有个建议是: 1.内存申请多少释放多少,释放掉你申请过的内存,不要乱释放: 2.不能释放已经释放的内存:

directx12中vetex buffer、index buffer和constant buffer绑定piple line的时机

类别 时机 函数 建Heap vetex buffer 在Draw函数中 ID3D12GraphicsCommandList::IASetVertexBuffer 否 index buffer 在Draw函数中 ID3D12GraphicsCommandList::IASetIndexBuffer 否 constant buffer 在程序初始化时 ID3D12Device::CreateConstantBufferView 是

insert buffer/change buffer double write buffer,双写 adaptive hash index(AHI) innodb的crash recovery innodb重要参数 innodb监控

https://yq.aliyun.com/articles/41000 http://blog.itpub.net/22664653/viewspace-1163838/ http://www.cnblogs.com/MYSQLZOUQI/p/5602206.html https://yq.aliyun.com/articles/222 主从不一致性的3种可能原因1.binlog format是不是row2.session级关闭binlog3.人工在slave修改数据 set sql_log_

The Bip Buffer - The Circular Buffer with a Twist

Introduction The Bip-Buffer is like a circular buffer, but slightly different. Instead of keeping one head and tail pointer to the data in the buffer, it maintains two revolving regions, allowing for fast data access without having to worry about wra