非直接缓冲区与直接缓冲区
allocate(int capacity):
作用:创建指定大小的非直接缓冲区对象,该缓冲区直接建立在JVM内存中;
源码:
package java.nio;...省略...public abstract class ByteBuffer extends Buffer implements Comparable<ByteBuffer>{...省略...public static ByteBuffer allocate(int capacity) {if (capacity < 0)throw createCapacityException(capacity);return new HeapByteBuffer(capacity, capacity, null);}...省略...}
package java.nio;class HeapByteBuffer extends ByteBuffer {...省略...HeapByteBuffer(int cap, int lim, MemorySegmentProxy segment) {// package-privatesuper(-1, 0, lim, cap, new byte[cap], 0, segment);//非直接缓冲区实质是一个数组/*hb = new byte[cap];offset = 0;*/this.address = ARRAY_BASE_OFFSET;}...省略...
}
原理:
说明:
1、读取:当Java应用程序读取文件时,磁盘文件数据先读取到操作系统内存,再拷贝到非直接缓冲区,然后才能被应用程序读取;
2、写入:当Java应用程序向文件写入时,首先将数据写入非直接缓冲区,再写入操作系统内存,然后才能写入到磁盘文件;
allocateDirect(int capacity):
作用:创建指定大小的直接缓冲区对象,该缓冲区直接建立在物理内存中,即物理内存映射文件,应用程序直接操作物理内存映射文件,这样减少了中间copy过程,极大得提高了读写效率
源码:
package java.nio;...省略...public abstract class ByteBuffer extends Buffer implements Comparable<ByteBuffer>{...省略...public static ByteBuffer allocateDirect(int capacity) {return new DirectByteBuffer(capacity);}...省略...
}
package java.nio;...省略...class DirectByteBuffer extends MappedByteBuffer implements DirectBuffer{...省略...DirectByteBuffer(int cap) { // package-privatesuper(-1, 0, cap, cap, null);boolean pa = VM.isDirectMemoryPageAligned();int ps = Bits.pageSize();long size = Math.max(1L, (long)cap + (pa ? ps : 0));Bits.reserveMemory(size, cap);long base = 0;try {base = UNSAFE.allocateMemory(size);} catch (OutOfMemoryError x) {Bits.unreserveMemory(size, cap);throw x;}UNSAFE.setMemory(base, size, (byte) 0);if (pa && (base % ps != 0)) {// Round up to page boundaryaddress = base + ps - (base & (ps - 1));} else {address = base;}cleaner = Cleaner.create(this, new Deallocator(base, size, cap));att = null;}...省略...
}
原理:
说明:
1、读取:当Java应用程序读取文件时,磁盘文件数据先读取到物理内存映射文件,然后应用程序直接从物理内存映射文件读取数据;
2、写入:当Java应用程序向文件写入时,首先将数据写入物理内存映射文件,然后操作系统直接将物理内存映射文件中数据写入到磁盘文件;
缺点:
1、非直接缓冲区由JVM分配,直接缓冲区由操作系统分配,直接缓冲区绕过了JVM堆栈,所以直接缓冲区创建和销毁比堆栈上的非直接缓冲区开销更大。
非直接缓冲区与直接缓冲区相关推荐
- java数组缓冲_java – 何时使用数组,缓冲区或直接缓冲区
题 在编写用于OpenGL库的Matrix类时,我遇到了使用Java数组或Buffer策略来存储数据的问题(JOGL为Matrix操作提供直接缓冲区副本).为了分析这一点,我写了一个小型性能测试程序, ...
- linux 多线程环形缓冲区,[多线程]环形缓冲区以及多线程条件同步
1.环形缓冲区(下面生产者消费者的例子使用) 使用一段内存空间作为缓冲区,维护两个指针,一是读指针,指向缓冲空间的第一个可读位置:二是写指针,指向空间的第一个空位置.读取一个数据后,读指针+1,当指针 ...
- java 缓冲区溢出_缓冲区溢出详解
1 缓冲区溢出原理 缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例.缓冲区可以是堆栈(自动变量).堆(动态内存)和静态数据区(全局或静态).在C/C++语言中,通常使用字符数组和mal ...
- 【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )
文章目录 I . 缓冲区 ( Buffer ) 存取类型 II . 只读缓冲区 ( ReadOnlyBuffer ) III . 映射字节缓冲区 ( MappedByteBuffer ) I . 缓冲 ...
- 【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
文章目录 I . AAudio 音频流内部缓冲区 与 音频数据读写缓冲区 概念 II . AAudio 音频流内部缓冲区 缓冲区帧容量 BufferCapacityInFrames 与 缓冲区帧大小 ...
- 在单缓冲区和双缓冲区结构下,读入并分析完该文件的时间分别是
链接:https://www.nowcoder.com/questionTerminal/5a9eff01452240a7a97495cef08ad3f6?toCommentId=398027 来源: ...
- linux文件系统dentry_Linux文件系统(四)---三大缓冲区之inode缓冲区 (内存inode映像 )...
在文件系统中,有三大缓冲为了提升效率:inode缓冲区.dentry缓冲区.块缓冲. (内核:2.4.37) 一.inode缓冲区 为了加快对索引节点的索引,引入inode缓冲区,下面我们看Linux ...
- DirectX11 With Windows SDK--03 索引缓冲区、常量缓冲区
前言 一个立方体有8个顶点,然而绘制一个立方体需要画12个三角形,如果按照前面的方法绘制的话,则需要提供36个顶点,而且这里面的顶点数据会重复4次甚至5次.这样的绘制方法会占用大量的内存空间. 接下来 ...
- 行缓冲、全缓冲、无缓冲以及用户缓冲区、内核缓冲区介绍
文章目录 1- 缓冲区介绍 (1)缓冲区以及作用 (2)缓冲区的类型 [1]行缓冲(验证) [2]全缓冲(验证) [3]无缓冲 2- 内核缓冲区与用户缓冲区 (1)用户进程和操作系统的关系 (2)用户 ...
- linux 目录缓冲,Linux文件系统(六)---三大缓冲区之 目录缓冲区dcache
在文件系统中,有三大缓冲为了提升效率:inode缓冲区.dentry缓冲区.块缓冲. (内核:2.4.37) 为什么这个缓冲区会存在,不好意思,我说了废话,当然和前面一样的,为了提升效率,例如我们写一 ...
最新文章
- 实现ASP.NET MVC3 HtmlHelper 的 RadioButtonList 与CheckBoxList 扩展
- 【直播预告】云栖直播:阿里热修复产品HotFix2.0升级详解
- 题解报告:hdu 5695 Gym Class(拓扑排序)
- 51nod1307(暴力树剖/二分dfs/并查集)
- 开发一款自动指向特定页面元素的jQuery插件:jQuery PointPoint
- memcmp()库函数实现
- php 三种传递函数,php – 是否可以将传递函数传递给包含的文件?
- 晨哥真有料丨一定要在一个月内让她爱上你!
- Android MDM 参考资料
- blackberry 7290 滚轮 垂直滚动
- iOS SpriteKit 小游戏开发实例 - Flappy Bird
- 【车载以太网】【SOMEIP】Wireshark测试someip
- UE4.虚幻4.简单介绍和学习视频推荐
- Android仿京东、淘宝商品详情页上拉查看更多详情
- adams和matlab联合仿真的书,MATLAB和ADAMS联合仿真
- 欧美女性flash网页模板
- 平行泊车系统路径规划(5)
- 如何下载因特尔显卡的最新驱动
- Vue2.0 新手完全填坑攻略——从环境搭建到发布
- java 中遍历双列集合_获取单列集合,双列集合,数组的Stream流对象以及简单操作...
热门文章
- 【看别人的,学习】文本增强,再也不怕用户要修改标准界面的字段描述了
- Mac OS X 安装ruby环境
- 解决Emacs输出PDF文件时Tex缺少.sty文件的方法
- HDOJ HDU 1023 1130 1133 1134 2067 ACM 1023 1130 1133 1134 2067 IN HDU ( 卡特兰数 专题 catalan )...
- RHEL服务器配置BIND以及实现DNS负载均衡
- 生活在REPL中(续):在REPL中动态加载依赖的库
- LeetCode刷刷记录
- linux+nginx+tomcat负载均衡,实现session同步
- 熬之滴水穿石:Spring--精简的J2EE(5)
- ArcGIS API for Silverlight 使用GeometryService进行河流网格划分(三)