ByteBuffer的allocate和allocateDirect区别

ByteBuffer的allocate和allocateDirect区别

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

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

  为什么要提供两种方式呢?这与Java的内存使用机制有关。

  1. 第一种分配方式产生的内存开销是在JVM中的,
  2. 第二种的分配方式产生的开销在JVM之外,以就是系统级的内存分配。

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

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

来自:  http://blog.sina.com.cn/s/blog_67dc11000101cpsk.html

时间: 2024-11-06 20:35:29

ByteBuffer的allocate和allocateDirect区别的相关文章

ByteBuffer的allocate和allocateDirect

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

ByteBuffer的allocate与allocateDirect2013-01-11

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

Android中直播视频技术探究之---基础核心类ByteBuffer解析

一.前言 前一篇文章我们介绍了Android中直播视频技术的基础大纲知识,这里就开始一一讲解各个知识点,首先主要来看一下视频直播中的一个重要的基础核心类:ByteBuffer,这个类看上去都知道了,是字节缓冲区处理字节的,这个类的功能非常强大,也在各个场景都有用到,比如网络数据底层处理,特别是结合网络通道信息处理的时候,还有就是后面要说到的OpenGL技术也要用到,当然在视频处理中也是很重要的,因为要处理视频流信息,比如在使用MediaCodec进行底层的视频流编码的时候,处理的就是字节,我们如

Java Buffer编程基础

目录 [?] Buffer抽象类的成员 属性properties 操作方法 Buffer的子类 ByteBuffer: 最通用的子类, 处理字节数据类型. CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer ShortBuffer MappedByteBuffer Buffer的创建 直接缓冲区和间接缓冲区 参考 Java 1.4中在java.nio包中增加了Buffer类以及一些处理基本数据类型的子类(除了boolean型) ,用来

20155335俞昆 《java程序设计》第八周总结

2016-2017-2 <Java程序设计>第X周学习总结 ##认识NIO 在java中,输入与输出,基本上是以字节为单位进行的低层次处理,实际上多半是对字节数组中整个区块进行处理,对于dump()方法,必须处理byte[] ,必须指定写出的byte[]的起点和字节数.例如 Java..io套件中有一些装饰类,例如DataInputStream,dataOutputStream,BufferedReader与Bufferedwriter等,若只要对字节或字符串中感兴趣的数据区块进行标记,像是标

Java I/O 扩展

Java I/O 扩展 NIO Java 的NIO(新IO)和传统的IO有着同样的目的: 输入 输出 .可是NIO使用了不同的方式来处理IO,NIO利用内存映射文件(此处文件的含义能够參考Unix的名言一切皆文件)来处理IO, NIO将文件或文件的一段区域映射到内存中(相似于操作系统的虚拟内存),这样就能够像訪问内存一样来訪问文件了. Channel 和 Buffer是NIO中的两个核心概念: Channel是对传统的IO系统的模拟,在NIO系统中全部的数据都须要通过Channel传输;Chan

Java NIO 缓冲区

Java NIO 在JDK1.4的时候引入,主要解决传统IO的一些性能问题.NIO 主要内容包含 Buffer .Channel.Selector等内容,本文主要讲解Buffer相关的内容. Buffer的继承体系 Buffer的子类比较多,但是继承关系比较简单.8种基本类型,除了布尔类型,其余的类型都有对应的Buffer实现,名字也十分好记:基本数据类型首字母大写+Buffer.其中ByteBuffer最为常用,因为字节是操作系统及其I/O设备使用的基本数据类型,后面演示的时候也主要使用字节缓

转:最近5年133个Java面试问题列表

最近5年133个Java面试问题列表 Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入. 在我初入职场的时候,类似于 Vector 与 Array 的区别.HashMap 与 Hashtable 的区别是最流行的问题,只需要记住它们,就能在面试中获得更好的机会,但这种情形已经不复存在.如今,你将会被问到许多 Java 程序员都没有看过的领域,如 NIO,

面试题_66_to_75_Java IO 和 NIO 的面试题

IO 是 Java 面试中一个非常重要的点.你应该很好掌握 Java IO,NIO,NIO2 以及与操作系统,磁盘 IO 相关的基础知识.下面是 Java IO 中经常问的问题. 66)在我 Java 程序中,我有三个 socket,我需要多少个线程来处理? 67)Java 中怎么创建 ByteBuffer? 68)Java 中,怎么读写 ByteBuffer ? 69)Java 采用的是大端还是小端? 70)ByteBuffer 中的字节序是什么? 71)Java 中,直接缓冲区与非直接缓冲器