HeapByteBuffer

DirectByteBuffer更快吗?

对着背影说爱祢 提交于 2019-12-02 14:38:18
ByteBuffer.allocateDirect vs ByteBuffer.allocate 操作系统的IO机制 操作系统在内存区域上执行IO操作,这些内存区域是连续的字节。毫无疑问只有字节缓冲区才有资格参与IO操作的。同样操作系统会直接访问进程空间,包括JVM进程,传输数据。JVM内部,字节数组可能不是连续的,或者GC任意时刻会移动这些字节。Java内部数组是对象,对象内部数据存储的方式,是跟JVM实现相关的。 引入Direct Buffer 出于这个原因,引入了direct buffer。direct buffer就是为了和channel和本地IO例程交互。direct buffer的实现会尽量让channel直接使用,本地操作系统代码能够直接读写。 利弊 直接缓冲区通常是IO操作的最佳选择,是JVM能够使用的最高效的IO机制。non-direct缓冲区可以传递给channel,但通常会带来性能损耗。通常non-direct缓冲区不是本地IO操作的直接目标。如果让channel写non-direct ByteBuffer,channel会隐含的执行下列步骤: 创建临时的direct ByteBuffer 复制non-direct buffer中的内容到临时buffer 使用临时buffer执行IO操作 临时buffer不被引用,最终被垃圾收集