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堆栈,所以直接缓冲区创建和销毁比堆栈上的非直接缓冲区开销更大。

非直接缓冲区与直接缓冲区相关推荐

  1. java数组缓冲_java – 何时使用数组,缓冲区或直接缓冲区

    题 在编写用于OpenGL库的Matrix类时,我遇到了使用Java数组或Buffer策略来存储数据的问题(JOGL为Matrix操作提供直接缓冲区副本).为了分析这一点,我写了一个小型性能测试程序, ...

  2. linux 多线程环形缓冲区,[多线程]环形缓冲区以及多线程条件同步

    1.环形缓冲区(下面生产者消费者的例子使用) 使用一段内存空间作为缓冲区,维护两个指针,一是读指针,指向缓冲空间的第一个可读位置:二是写指针,指向空间的第一个空位置.读取一个数据后,读指针+1,当指针 ...

  3. java 缓冲区溢出_缓冲区溢出详解

    1 缓冲区溢出原理 缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例.缓冲区可以是堆栈(自动变量).堆(动态内存)和静态数据区(全局或静态).在C/C++语言中,通常使用字符数组和mal ...

  4. 【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )

    文章目录 I . 缓冲区 ( Buffer ) 存取类型 II . 只读缓冲区 ( ReadOnlyBuffer ) III . 映射字节缓冲区 ( MappedByteBuffer ) I . 缓冲 ...

  5. 【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )

    文章目录 I . AAudio 音频流内部缓冲区 与 音频数据读写缓冲区 概念 II . AAudio 音频流内部缓冲区 缓冲区帧容量 BufferCapacityInFrames 与 缓冲区帧大小 ...

  6. 在单缓冲区和双缓冲区结构下,读入并分析完该文件的时间分别是

    链接:https://www.nowcoder.com/questionTerminal/5a9eff01452240a7a97495cef08ad3f6?toCommentId=398027 来源: ...

  7. linux文件系统dentry_Linux文件系统(四)---三大缓冲区之inode缓冲区 (内存inode映像 )...

    在文件系统中,有三大缓冲为了提升效率:inode缓冲区.dentry缓冲区.块缓冲. (内核:2.4.37) 一.inode缓冲区 为了加快对索引节点的索引,引入inode缓冲区,下面我们看Linux ...

  8. DirectX11 With Windows SDK--03 索引缓冲区、常量缓冲区

    前言 一个立方体有8个顶点,然而绘制一个立方体需要画12个三角形,如果按照前面的方法绘制的话,则需要提供36个顶点,而且这里面的顶点数据会重复4次甚至5次.这样的绘制方法会占用大量的内存空间. 接下来 ...

  9. 行缓冲、全缓冲、无缓冲以及用户缓冲区、内核缓冲区介绍

    文章目录 1- 缓冲区介绍 (1)缓冲区以及作用 (2)缓冲区的类型 [1]行缓冲(验证) [2]全缓冲(验证) [3]无缓冲 2- 内核缓冲区与用户缓冲区 (1)用户进程和操作系统的关系 (2)用户 ...

  10. linux 目录缓冲,Linux文件系统(六)---三大缓冲区之 目录缓冲区dcache

    在文件系统中,有三大缓冲为了提升效率:inode缓冲区.dentry缓冲区.块缓冲. (内核:2.4.37) 为什么这个缓冲区会存在,不好意思,我说了废话,当然和前面一样的,为了提升效率,例如我们写一 ...

最新文章

  1. 实现ASP.NET MVC3 HtmlHelper 的 RadioButtonList 与CheckBoxList 扩展
  2. 【直播预告】云栖直播:阿里热修复产品HotFix2.0升级详解
  3. 题解报告:hdu 5695 Gym Class(拓扑排序)
  4. 51nod1307(暴力树剖/二分dfs/并查集)
  5. 开发一款自动指向特定页面元素的jQuery插件:jQuery PointPoint
  6. memcmp()库函数实现
  7. php 三种传递函数,php – 是否可以将传递函数传递给包含的文件?
  8. 晨哥真有料丨一定要在一个月内让她爱上你!
  9. Android MDM 参考资料
  10. blackberry 7290 滚轮 垂直滚动
  11. iOS SpriteKit 小游戏开发实例 - Flappy Bird
  12. 【车载以太网】【SOMEIP】Wireshark测试someip
  13. UE4.虚幻4.简单介绍和学习视频推荐
  14. Android仿京东、淘宝商品详情页上拉查看更多详情
  15. adams和matlab联合仿真的书,MATLAB和ADAMS联合仿真
  16. 欧美女性flash网页模板
  17. 平行泊车系统路径规划(5)
  18. 如何下载因特尔显卡的最新驱动
  19. Vue2.0 新手完全填坑攻略——从环境搭建到发布
  20. java 中遍历双列集合_获取单列集合,双列集合,数组的Stream流对象以及简单操作...

热门文章

  1. 【看别人的,学习】文本增强,再也不怕用户要修改标准界面的字段描述了
  2. Mac OS X 安装ruby环境
  3. 解决Emacs输出PDF文件时Tex缺少.sty文件的方法
  4. HDOJ HDU 1023 1130 1133 1134 2067 ACM 1023 1130 1133 1134 2067 IN HDU ( 卡特兰数 专题 catalan )...
  5. RHEL服务器配置BIND以及实现DNS负载均衡
  6. 生活在REPL中(续):在REPL中动态加载依赖的库
  7. LeetCode刷刷记录
  8. linux+nginx+tomcat负载均衡,实现session同步
  9. 熬之滴水穿石:Spring--精简的J2EE(5)
  10. ArcGIS API for Silverlight 使用GeometryService进行河流网格划分(三)