ByteBuffer的allocate与allocateDirect2013-01-11

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

public static ByteBuffer allocate(int capacity)  
  
public static ByteBuffer allocateDirect(int capacity)

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

由图可以看出,当操作数据量很小时,两种分配方式操作使用时间基本是相同的,第一种方式有时可能会更快,但是当数据量很大时,第二种方式会远远大于第一种的分配方式。

另注:

当Java程序接收到外部传来的数据时,allocateDirect 优势才能体现。

经过测试发现,如果仅是在jvm内操作字节数组,比如:

ByteBuffer.allocateDirect(...)put(byte[]...)  的速度远没有 ByteBuffer.allocate(xxx).put(byte[]...)快。

2013-01-11

时间: 2024-10-18 08:11:55

ByteBuffer的allocate与allocateDirect2013-01-11的相关文章

接口2014年6月11日01:11:37

1 [1]C#中的接口和类有什么异同. 2 3 不同点: 4 不能直接实例化接口. 5 接口不包含方法的实现. 6 接口可以多继承,类只能单继承. 7 类定义可在不同的源文件之间进行拆分(partial). 8 9 相同点: 10 接口.类和结构都可以从多个接口继承. 11 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员. 12 接口和类都可以包含事件.索引器.方法和属性(属性本质上是两个方法). 13 14 基础知识:接口只能定义方法(只能定义行为,不能定义实现也就是字段

ByteBuffer的allocate和allocateDirect区别

ByteBuffer的allocate和allocateDirect区别 在Java中当我们要对数据进行更底层的操作时,通常是操作数据的字节(byte)形式,这时常常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: public static ByteBuffer allocate(int capacity) public static ByteBuffer allocateDirect(int capacity) 为什么要提供两种方式呢?这与Java的内存使用

ByteBuffer的allocate和allocateDirect

在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类.ByteBuffer提供了两种静态实例方式: Java代码   public static ByteBuffer allocate(int capacity) public static ByteBuffer allocateDirect(int capacity) 为什么要提供两种方式呢?这与Java的内存使用机制有关.第一种分配方式产生的内存开销是在JVM中的,而

以 “日” 为单位的可以翻页的效果 显示为 2016/01/11

先上效果图: 动作和“周”是一样的,步骤简化,: 一.日期容器html <!--日期的容器--> <div class="headerDiv"> <div id="previousDiv" class="previousImgDiv"></div> <div id="nextDiv" class="unNextImgDiv" ></div&g

Cheatsheet: 2015 11.01 ~ 11.30

Golang Roadomatic: Node vs. Go Quick Guide to Golang for Java Developers 3 Go Gotchas Web Choosing a Front End Framework: Angular vs. Ember vs. React Microservices Decoded: Best Practices and Stacks Mastering ASP.NET 5 without growing a beard 5 Tips

ygRan Java1.0-1.11各个版本的新特性

JDK Version 1.01996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢. JDK Version 1.11997-02-19 JDBC(Java DataBase Connectivity);支持内部类;RMI(Remote Method Invocation) ;反射;Java Bean;JDK Version 1.21998-12-08 Playground(操场) 集合框架;JIT(Just In Time)

Daily Recording 2020/01/11 (关键词:ARP,计算机网络基础)

Daily Recording Wang yuan can January 11, 2020 @雨人网安 日报 日报开始 今天是周六,持续六天的高强度学习迎来了“伟大的休息日”,今天的学习内容相对轻松,刚开始Bai在讲计算机网络基础的时候希望通过小视频的方式让我们来了解,后面越看越跑题了,原子弹制造.高铁运作流程.飞机票出票流程......,就这样,我们在bilibili看一上午有趣的小视频.下午Bai带着我们阅读了一个关于“内网渗透”的博文,讲的是博主如何渗透进蹭自己家wifi的人的电脑,后面

2016/01/11开始学习git:查看仓库状态和修改文件

1.使用git status查看版本库的状态 $ git statusOn branch masternothing to commit, working directory cleanGit告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的. 2.现在去修改readme.txt的内容 原本内容为: Git is a version control system.Git is free software. 修改后: Git is distri

19 01 11 javascript 获取某一种元素(所有的标签) 以及字符串处理的方法

获取元素方法二 可以使用内置对象document上的getElementsByTagName方法来获取页面上的某一种标签,获取的是一个选择集,不是数组,但是可以用下标的方式操作选择集里面的标签元素. 注意 拿出来的是一个数组   所以不能直接进行操作 <script type="text/javascript"> window.onload = function(){ var aLi = document.getElementsByTagName('li'); // aLi