ByteBuffer 实现原理
时间:2019-11-11
本文章向大家介绍ByteBuffer 实现原理,主要包括ByteBuffer 实现原理使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一,概述
ByteBuffer 是Buffer类的重要实现类,nio中最常用的缓冲区,提供了一组功能用于操作byte数组
缺点:无法自动扩容
主要实现方式分为两种:
1,直接操作内存的地址保存数据,实现类:DirectByteBuffer,
2,内建字节数组保存数据,实现类:HeapByteBuffer
类继承图
二,实现类
(1),DirectByteBuffer
通过ByteBuffer 提供的函数获取 DirectByteBuffer的实例
ByteBuffer sendBuf = ByteBuffer.allocate(10);//获取堆内存buff:使用byte数组保存数据
DirectByteBuffer通过unsafe类实现堆外内存的操作
1,构造器处理过程:
cap:设置初始容量大小
DirectByteBuffer(int cap) { // package-private //初始父类中的 mark,lim,pos,cap super(-1, 0, cap, cap); 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)) { address = base + ps - (base & (ps - 1)); // 获取本buffer的首地址 } else { address = base; } cleaner = Cleaner.create(this, new Deallocator(base, size, cap));//保留地址,用于释放地址 att = null; }
(2),HeapByteBuffer
获取实例
ByteBuffer sendBuf = ByteBuffer.allocate(10);//获取堆内存buff:使用byte数组保存数据
基于堆的数据缓存区,数据处理比使用直接内存慢
创建实例时,构造器new byte创建保存数据的Byte数组,cap设置的缓冲区大小
原文地址:https://www.cnblogs.com/dybe/p/11771751.html
- 高级盲注—floor,rand,group by报错注入
- 刷脸注册、试装、支付……仅靠一张脸就能买买买的时尚店开业了
- JavaScript引用类型之Array数组之强大的splice()方法
- Linux快速入门03-系统管理
- JavaScript引用类型之Array数组的concat()和push()方法的区别
- JavaScript引用类型之Array数组的排序方法
- Linux快速入门02-文件系统管理
- JavaScript引用类型之Array数组的toString()和valueof()方法的区别
- Linux快速入门04-扩展知识
- JavaScript引用类型之Array数组的拼接方法-concat()和截取方法-slice()
- JavaScript引用类型之Array数组的拼接方法-concat()和截取方法-slice()
- 比特币在2017全球新闻谷歌搜索中排名第二,韩国政府聚焦比特币市场诈骗和假冒交易所
- ExtJs学习笔记(13)_Card布局
- Html与CSS快速入门03-CSS基础应用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 语义分割之Dice Loss深度分析
- SAP CRM One Order函数SAVE_EC的设计原理
- SAP CRM One Order函数CHANGE_OW的设计原理
- 关于checkpoint你可能不知道的事
- SAP CRM One Order函数CRM_Object_FILL_OW的设计原理
- SAP CRM One Order header extension的缓存机制设计原理
- SAP CRM数据库表CRMD_CUMULAT_H的设计原理
- Python从入门到大师一百篇教程 | 前言:Python的前世和发展
- Java和ABAP的垃圾回收机制(Garbage Collection)比较
- Java和SAP ABAP的异常处理
- Java的字节码和ABAP load的比较
- matplotlib | Python强大的作图工具,让你从此驾驭图表(一)
- 使用ES6的fetch API读取数据时要注意的一个和cookie相关的坑
- 跟牛老师一起学WEBGIS——WEBGIS基础(地图切片)
- Go语言 | 并发设计中的同步锁与waitgroup用法