ByteBuffer.allocate()与allocateDirect()的区别
allocate()
产生的是HeapByteBuffer
的实例, 本质上是一个no direct buffer
, allocateDirect()
产生的是DirectByteBuffer
的实例, 本质是一个direct buffer
- 主要区别
buffer
的创建方式不同,no direct buffer
还可以通过封装已存在的byte array
来产生- 执行IO操作时不同,
no direct buffer
会将自己复制到中间buffer
中, 而direct buffer
不会 no direct buffer
分配在heap
上, 而direct buffer
分配在直接内存中, 并不在JVM
虚拟机中
在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式:
- public static ByteBuffer allocate(int capacity)
- public static ByteBuffer allocateDirect(int capacity)
为什么要提供两种方式呢?这与Java的内存使用机制有关。第一种分配方式产生的内存开销是在JVM中的,而另外一种的分配方式产生的开销在JVM之外,以就是系统级的内存分配。当Java程序接收到外部传来的数据时,首先是被系统内存所获取,然后在由系统内存复制复制到JVM内存中供Java程序使用。所以在另外一种分配方式中,能够省去复制这一步操作,效率上会有所提高。可是系统级内存的分配比起JVM内存的分配要耗时得多,所以并非不论什么时候allocateDirect的操作效率都是最高的。以下是一个不同容量情况下两种分配方式的操作时间对照:
由图能够看出,当操作数据量非常小时,两种分配方式操作使用时间基本是同样的,第一种方式有时可能会更快,可是当数据量非常大时,另外一种方式会远远大于第一种的分配方式。
ByteBuffer.allocate()与allocateDirect()的区别相关推荐
- NIO ByteBuffer 的 allocate 和 allocateDirect 的区别(HeapByteBuffer 和 DirectByteBuffer 的区别)
ByteBuffer 中 NIO里用得最多的Buffer ,有两种实现方式:HeapByteBuffer基于Java堆的实现,而DirectByteBuffer 使用了 unsafed 的API 进行 ...
- ByteBuffer.Allocate vs AllocateDirect
2019独角兽企业重金招聘Python工程师标准>>> Allocation on heap, GC involved. the process used 2G RAM the ...
- NIO ByteBuffer的allocate与allocateDirect区别(HeapByteBuffer与DirectByteBuffer的区别)
在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类. ByteBuffer提供了两种静态实例方式: public stat ...
- ByteBuffer的allocate和allocateDirect区别
在Java中当我们要对数据进行更底层的操作时,通常是操作数据的字节(byte)形式,这时常常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...
- ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别
在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...
- ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别。
在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...
- ByteBuffer的allocate和allocateDirect
在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: Java代码 pub ...
- ByteBuffer.allocate()/ByteBuffer.allocateDirect()/JNI DETECTED ERROR IN APPLICATION: jarray was NULL
在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...
- allocate与allocateDirect的性能测试
allocate与allocateDirect的性能测试 测试工具JMH 测试代码 JMH结果 结论 测试工具JMH java基准测试框架 测试代码 直接分配系统内存(allocateDirect) ...
最新文章
- Urllib库函数、代理、爬取案例
- 【CodeVS2226】飞行棋
- c# xls 复制一行_c# – 将excel工作簿中的第一行复制到新的Excel工作簿
- 就这么简单!构建强大的WebShell防护体系
- 卫生纸玫瑰花折法5步_手工教程:做一个漂亮的玫瑰花捧花,用折纸表达我喜欢你...
- c 语言试题及解析,C语言试题及答案解析.pdf
- Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码
- 远程访问大华摄像头_通过WEB调用大华网络摄像头
- 搜狗拼音输入法居然输入不了半角的人民币符号¥¥¥¥¥¥¥¥!!!
- 酒店管理系统数据库SQl设计思路
- Linux下通过命令行登录北交校园网
- CAD绘图设计中怎样删除CAD图层?怎样清理CAD图层文件?
- Java:实现Prim算法(附完整源码)
- 大数据项目实践过程笔记
- 怎样恢复华为计算机,华为电脑一键还原怎么操作详细教程
- Java的String类的常用方法【总结】
- 蓝桥杯python组练题第二天——成绩统计——蓝桥杯官网题库
- wince 系统定制
- Mysql rbo和cbo_CBO和RBO介绍(好)
- 2023年第二十届五一数学建模竞赛题目 C题详细思路
热门文章
- HPA 自动水平伸缩 POD
- 持久数据结构 Persistent data structures
- 内网渗透(八十一)之搭建Exchange服务器
- VS2019+Fortran语言配置
- 2023年05月个人工作生活总结
- Multi-exposure image fusion via deep perceptual enhancement 通过深度感知增强实现多曝光图像融合
- 蓝牙耳机什么牌子的好用?真无线蓝牙耳机排名!
- linux看以前敲过的指令,在Linux命令终端中查看和编辑曾执行过的命令
- Android中的diglog对话框
- sync神key_告诉你 Redis 是一个牛逼货