在Java中当我们要对数据进行更底层的操作时,通常是操作数据的字节(byte)形式,这时常常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式:
- public static ByteBuffer allocate(int capacity)
- public static ByteBuffer allocateDirect(int capacity)
为什么要提供两种方式呢?这与Java的内存使用机制有关。第一种分配方式产生的内存开销是在JVM中的,而第二种的分配方式产生的开销在JVM之外,以就是系统级的内存分配。当Java程序接收到外部传来的数据时,首先是被系统内存所获取,然后在由系统内存复制拷贝到JVM内存中供Java程序使用。所以在第二种分配方式中,可以省去复制这一步操作,效率上会有所提高。但是系统级内存的分配比起JVM内存的分配要耗时得多,所以并不是任何时候allocateDirect的操作效率都是最高的。下面是一个不同容量情况下两种分配方式的操作时间对比: 由图可以看出,当操作数据量很小时,两种分配方式操作使用时间基本是相同的,第一种方式有时可能会更快,但是当数据量很大时,第二种方式会远远大于第一种的分配方式。
分享到:
相关推荐
1. **分配缓冲区**:可以通过`ByteBuffer.allocate(int capacity)`来创建一个新的ByteBuffer,其中capacity参数指定缓冲区的大小。 2. **直接缓冲区**:对于性能敏感的应用,可以使用`ByteBuffer.allocateDirect...
2. 使用`ByteBuffer.allocateDirect(int capacity)`:分配一个直接缓冲区,直接缓冲区通常在物理内存中,而不是Java堆上,能提高性能,尤其在处理大文件时。 3. 使用`ByteBuffer.wrap(byte[] array)`:将已有的字节...
此外,ByteBuffer还提供了静态方法allocate、allocateDirect等,用于创建堆内或堆外缓冲区,其中堆外缓冲区可以避免频繁的内存复制,提高性能。 在使用NIO时,通常会遵循以下步骤: 1. 创建Buffer,如ByteBuffer。 ...
在`CoreJava_day21`的学习笔记中,主要探讨了Java中的NIO(New I/O)包及其关键类和接口,包括`ByteBuffer`、`FileChannel`以及网络编程中常用的`ServerSocket`和`Socket`等。NIO自JDK 1.4引入以来,因其高效性和...
除了`allocate()`和`allocateDirect()`,还可以使用`wrap()`方法,将已有的数组包装成对应类型的缓冲区,例如: ```java byte[] byteArray = new byte[1024]; ByteBuffer bufferFromArray = ByteBuffer.wrap...
ByteBuffer wBuffer = ByteBuffer.allocateDirect(bufSize); ``` - 使用`RandomAccessFile`创建`FileChannel`,这种方式支持随机访问文件。 - `ByteBuffer`用于缓存读写操作的数据,`allocateDirect`可以提高...
1. **实例化**:可以通过调用`ByteBuffer.allocate(int capacity)`或`ByteBuffer.allocateDirect(int capacity)`来创建`ByteBuffer`对象。前者创建的是堆内存中的缓冲区,而后者则是直接缓冲区,通常用于频繁读写的...
实例化ByteBuffer有两种主要方式:allocate()用于在堆上分配内存,而allocateDirect()则是在堆外直接分配,适用于需要高效访问和多次复用的情况。ByteBuffer还可以通过wrap()方法从byte数组中创建,或者通过put()...
每个Buffer类都有allocate、allocateDirect等方法来创建缓冲区。 3. **直接缓冲区(DirectByteBuffer)**:直接缓冲区不经过Java堆,直接在操作系统层面分配内存,减少了数据复制,提高性能。但并非所有场景都适用,...
与`ByteBuffer.allocate()`不同,`allocateDirect()`不会在Java堆上分配内存,而是请求操作系统分配一块连续的物理内存空间。 3. **直接缓冲区与间接缓冲区的区别**: - **内存位置**:间接缓冲区(Heap ...
ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024); ``` #### 六、总结 本文档通过对NIO库的详细介绍,旨在帮助Java开发者更好地理解和掌握NIO的核心概念和技术细节。通过学习缓冲区、通道和选择器等关键...
缓冲池通过`java.nio.Buffers`类的静态方法创建,例如`allocate()`和`allocateDirect()`。`allocate()`创建的是堆缓冲区,而`allocateDirect()`创建的是直接缓冲区,后者能避免Java对象与操作系统之间的数据复制,...
- `ByteBuffer.allocate(int capacity)`:创建一个具有指定容量的`ByteBuffer`。 - `ByteBuffer.allocateDirect(int capacity)`:创建一个直接的`ByteBuffer`。直接`ByteBuffer`在执行IO操作时通常性能更佳,因为它...
- `allocateDirect(int capacity)`:创建一个Direct ByteBuffer,它通常在内存映射文件或直接I/O操作中性能更优。 - `wrap(byte[] array)`:将已存在的字节数组包装成ByteBuffer。 - `wrap(byte[] array, int offset...
- allocateDirect(int capacity): 分配一个新的直接字节缓冲区。 - array(): 返回此缓冲区的底层字节数组。 - arrayOffset(): 返回此缓冲区的底层字节数组的偏移量。 - asCharBuffer(): 将此缓冲区转换为CharBuffer...
`ByteBuffer`有几种不同的分配方式,如`allocate`、`allocateDirect`等,它们之间的主要区别在于内存分配方式和性能特性。`allocate`创建的是堆内存上的缓冲区,而`allocateDirect`创建的是在物理内存中的直接缓冲区...
在Java中,`ByteBuffer.allocateDirect()`方法是用来分配堆外内存的,这个方法实际上创建了一个`DirectByteBuffer`对象。`DirectByteBuffer`是一个Java类,它本身存储在堆内存中,但是通过`native`方法`unsafe....
- **字符集类**:讲解了 `Charset` 类及其相关方法,如 `forName(String charsetName)`、`encode(CharBuffer source)` 和 `decode(ByteBuffer source)`。 - **服务提供者接口**:介绍 `CharsetServiceProvider` 接口...