allocate()产生的是HeapByteBuffer的实例, 本质上是一个no direct bufferallocateDirect()产生的是DirectByteBuffer的实例, 本质是一个direct buffer

  • 主要区别

    1. buffer的创建方式不同, no direct buffer还可以通过封装已存在的byte array来产生
    2. 执行IO操作时不同, no direct buffer会将自己复制到中间buffer中, 而direct buffer不会
    3. no direct buffer分配在heap上, 而direct buffer分配在直接内存中, 并不在JVM虚拟机中

在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式:

  1. public static ByteBuffer allocate(int capacity)
  2. public static ByteBuffer allocateDirect(int capacity)

为什么要提供两种方式呢?这与Java的内存使用机制有关。第一种分配方式产生的内存开销是在JVM中的,而另外一种的分配方式产生的开销在JVM之外,以就是系统级的内存分配。当Java程序接收到外部传来的数据时,首先是被系统内存所获取,然后在由系统内存复制复制到JVM内存中供Java程序使用。所以在另外一种分配方式中,能够省去复制这一步操作,效率上会有所提高。可是系统级内存的分配比起JVM内存的分配要耗时得多,所以并非不论什么时候allocateDirect的操作效率都是最高的。以下是一个不同容量情况下两种分配方式的操作时间对照:

 
由图能够看出,当操作数据量非常小时,两种分配方式操作使用时间基本是同样的,第一种方式有时可能会更快,可是当数据量非常大时,另外一种方式会远远大于第一种的分配方式。

ByteBuffer.allocate()与allocateDirect()的区别相关推荐

  1. NIO ByteBuffer 的 allocate 和 allocateDirect 的区别(HeapByteBuffer 和 DirectByteBuffer 的区别)

    ByteBuffer 中 NIO里用得最多的Buffer ,有两种实现方式:HeapByteBuffer基于Java堆的实现,而DirectByteBuffer 使用了 unsafed 的API 进行 ...

  2. ByteBuffer.Allocate vs AllocateDirect

    2019独角兽企业重金招聘Python工程师标准>>> Allocation on heap, GC involved.  the process used 2G RAM  the ...

  3. NIO ByteBuffer的allocate与allocateDirect区别(HeapByteBuffer与DirectByteBuffer的区别)

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类. ByteBuffer提供了两种静态实例方式: public stat ...

  4. ByteBuffer的allocate和allocateDirect区别

    在Java中当我们要对数据进行更底层的操作时,通常是操作数据的字节(byte)形式,这时常常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  5. ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  6. ByteBuffer.allocate()与ByteBuffer.allocateDirect()方法的区别。

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  7. ByteBuffer的allocate和allocateDirect

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: Java代码   pub ...

  8. ByteBuffer.allocate()/ByteBuffer.allocateDirect()/JNI DETECTED ERROR IN APPLICATION: jarray was NULL

    在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public stati ...

  9. allocate与allocateDirect的性能测试

    allocate与allocateDirect的性能测试 测试工具JMH 测试代码 JMH结果 结论 测试工具JMH java基准测试框架 测试代码 直接分配系统内存(allocateDirect) ...

最新文章

  1. Urllib库函数、代理、爬取案例
  2. 【CodeVS2226】飞行棋
  3. c# xls 复制一行_c# – 将excel工作簿中的第一行复制到新的Excel工作簿
  4. 就这么简单!构建强大的WebShell防护体系
  5. 卫生纸玫瑰花折法5步_手工教程:做一个漂亮的玫瑰花捧花,用折纸表达我喜欢你...
  6. c 语言试题及解析,C语言试题及答案解析.pdf
  7. Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码
  8. 远程访问大华摄像头_通过WEB调用大华网络摄像头
  9. 搜狗拼音输入法居然输入不了半角的人民币符号¥¥¥¥¥¥¥¥!!!
  10. 酒店管理系统数据库SQl设计思路
  11. Linux下通过命令行登录北交校园网
  12. CAD绘图设计中怎样删除CAD图层?怎样清理CAD图层文件?
  13. Java:实现Prim算法(附完整源码)
  14. 大数据项目实践过程笔记
  15. 怎样恢复华为计算机,华为电脑一键还原怎么操作详细教程
  16. Java的String类的常用方法【总结】
  17. 蓝桥杯python组练题第二天——成绩统计——蓝桥杯官网题库
  18. wince 系统定制
  19. Mysql rbo和cbo_CBO和RBO介绍(好)
  20. 2023年第二十届五一数学建模竞赛题目 C题详细思路

热门文章

  1. HPA 自动水平伸缩 POD
  2. 持久数据结构 Persistent data structures
  3. 内网渗透(八十一)之搭建Exchange服务器
  4. VS2019+Fortran语言配置
  5. 2023年05月个人工作生活总结
  6. Multi-exposure image fusion via deep perceptual enhancement 通过深度感知增强实现多曝光图像融合
  7. 蓝牙耳机什么牌子的好用?真无线蓝牙耳机排名!
  8. linux看以前敲过的指令,在Linux命令终端中查看和编辑曾执行过的命令
  9. Android中的diglog对话框
  10. sync神key_告诉你 Redis 是一个牛逼货