`
younglibin
  • 浏览: 1214547 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ByteBuffer的allocate和allocateDirect

阅读更多

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

Java代码  收藏代码
  1. public static ByteBuffer allocate(int capacity)  
  2. public static ByteBuffer allocateDirect(int capacity)  


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

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

分享到:
评论

相关推荐

    Android中的ByteBuffer解析

    1. **分配缓冲区**:可以通过`ByteBuffer.allocate(int capacity)`来创建一个新的ByteBuffer,其中capacity参数指定缓冲区的大小。 2. **直接缓冲区**:对于性能敏感的应用,可以使用`ByteBuffer.allocateDirect...

    Java NIO学习笔记——ByteBuffer用法

    2. 使用`ByteBuffer.allocateDirect(int capacity)`:分配一个直接缓冲区,直接缓冲区通常在物理内存中,而不是Java堆上,能提高性能,尤其在处理大文件时。 3. 使用`ByteBuffer.wrap(byte[] array)`:将已有的字节...

    学习笔记 java\CoreJava笔记\CoreJava_day21

    在`CoreJava_day21`的学习笔记中,主要探讨了Java中的NIO(New I/O)包及其关键类和接口,包括`ByteBuffer`、`FileChannel`以及网络编程中常用的`ServerSocket`和`Socket`等。NIO自JDK 1.4引入以来,因其高效性和...

    java.nio API详解

    此外,ByteBuffer还提供了静态方法allocate、allocateDirect等,用于创建堆内或堆外缓冲区,其中堆外缓冲区可以避免频繁的内存复制,提高性能。 在使用NIO时,通常会遵循以下步骤: 1. 创建Buffer,如ByteBuffer。 ...

    Java中的缓冲区(直接缓冲区、非直接缓冲区等).docx

    除了`allocate()`和`allocateDirect()`,还可以使用`wrap()`方法,将已有的数组包装成对应类型的缓冲区,例如: ```java byte[] byteArray = new byte[1024]; ByteBuffer bufferFromArray = ByteBuffer.wrap...

    java读取大文件大全

    ByteBuffer wBuffer = ByteBuffer.allocateDirect(bufSize); ``` - 使用`RandomAccessFile`创建`FileChannel`,这种方式支持随机访问文件。 - `ByteBuffer`用于缓存读写操作的数据,`allocateDirect`可以提高...

    android开发进阶之NIO非阻塞包

    1. **实例化**:可以通过调用`ByteBuffer.allocate(int capacity)`或`ByteBuffer.allocateDirect(int capacity)`来创建`ByteBuffer`对象。前者创建的是堆内存中的缓冲区,而后者则是直接缓冲区,通常用于频繁读写的...

    Java NIO(通道+缓冲区+选择器)

    每个Buffer类都有allocate、allocateDirect等方法来创建缓冲区。 3. **直接缓冲区(DirectByteBuffer)**:直接缓冲区不经过Java堆,直接在操作系统层面分配内存,减少了数据复制,提高性能。但并非所有场景都适用,...

    Android开发进阶之NIO非阻塞包[定义].pdf

    实例化ByteBuffer有两种主要方式:allocate()用于在堆上分配内存,而allocateDirect()则是在堆外直接分配,适用于需要高效访问和多次复用的情况。ByteBuffer还可以通过wrap()方法从byte数组中创建,或者通过put()...

    【IT十八掌徐培成】Java基础第26天-08.DirectByteBuffer2.zip

    与`ByteBuffer.allocate()`不同,`allocateDirect()`不会在Java堆上分配内存,而是请求操作系统分配一块连续的物理内存空间。 3. **直接缓冲区与间接缓冲区的区别**: - **内存位置**:间接缓冲区(Heap ...

    Java Nio ibm技术文档

    ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024); ``` #### 六、总结 本文档通过对NIO库的详细介绍,旨在帮助Java开发者更好地理解和掌握NIO的核心概念和技术细节。通过学习缓冲区、通道和选择器等关键...

    缓冲池 (2).doc.zip

    缓冲池通过`java.nio.Buffers`类的静态方法创建,例如`allocate()`和`allocateDirect()`。`allocate()`创建的是堆缓冲区,而`allocateDirect()`创建的是直接缓冲区,后者能避免Java对象与操作系统之间的数据复制,...

    java NOI 学习

    - `ByteBuffer.allocate(int capacity)`:创建一个具有指定容量的`ByteBuffer`。 - `ByteBuffer.allocateDirect(int capacity)`:创建一个直接的`ByteBuffer`。直接`ByteBuffer`在执行IO操作时通常性能更佳,因为它...

    Java_NIO_API详解

    - `allocateDirect(int capacity)`:创建一个Direct ByteBuffer,它通常在内存映射文件或直接I/O操作中性能更优。 - `wrap(byte[] array)`:将已存在的字节数组包装成ByteBuffer。 - `wrap(byte[] array, int offset...

    ByteBufferTest.rar_Java编程_Java_

    `ByteBuffer`有几种不同的分配方式,如`allocate`、`allocateDirect`等,它们之间的主要区别在于内存分配方式和性能特性。`allocate`创建的是堆内存上的缓冲区,而`allocateDirect`创建的是在物理内存中的直接缓冲区...

    深入解读 Java 堆外内存(直接内存)1

    在Java中,`ByteBuffer.allocateDirect()`方法是用来分配堆外内存的,这个方法实际上创建了一个`DirectByteBuffer`对象。`DirectByteBuffer`是一个Java类,它本身存储在堆内存中,但是通过`native`方法`unsafe....

    Java NIO.pdf

    - **字符集类**:讲解了 `Charset` 类及其相关方法,如 `forName(String charsetName)`、`encode(CharBuffer source)` 和 `decode(ByteBuffer source)`。 - **服务提供者接口**:介绍 `CharsetServiceProvider` 接口...

    Java NIO 主要类和方法(Java NIO中文版 附录C)

    - allocateDirect(int capacity): 分配一个新的直接字节缓冲区。 - array(): 返回此缓冲区的底层字节数组。 - arrayOffset(): 返回此缓冲区的底层字节数组的偏移量。 - asCharBuffer(): 将此缓冲区转换为CharBuffer...

    java实现超大文件的读写功能

    ByteBuffer wBuffer = ByteBuffer.allocateDirect(bufSize); readFileByLine(bufSize, fcin, rBuffer, fcout, wBuffer); System.out.print("读写完成!"); } public static void readFileByLine(int bufSize...

Global site tag (gtag.js) - Google Analytics