java NIO buffer --directBuffer

Posted 你所能做的,就是不断的学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java NIO buffer --directBuffer 相关的知识,希望对你有一定的参考价值。

HeapBuffer ----堆缓冲    :其实是在java 的内存模型中,java 虚拟机可以直接管控的

DirectBuffer ---直接缓冲 :使用的是native ,与操作系统挂钩,调用的是c 或者c++ 的代码,不在java 的内存模型中,我们称为堆外内存,因为不属于java 内存模型,所以java 虚拟机管控不到; 但是 address 维护了堆外内存的引用 (在buffer 类中维护者 long address)

 

那么问题来了,为什么不直接用HeapBuffer 操作,反而 使用DirectBuffer  还引入了一个不在java 内存模型的堆外内存呢?

显而易见,为了效率,使用 HeapBuffer  会多了一次数据COPY 的过程,多了一步他会将java 内存模型的数据copy 到java 内存模型之外的与操作系统相关的一块内存中(为啥要copy 呢?主要是为了防止gc 的回收,所以再copy 一份 ),然后才有I/O设备发生联系

然而使用DirectBuffer   ,真正的数据已经在基于操作系统的堆外放着,数据的读写直接与堆外的内存打交道,少了一次数据的读写过程,实现了zero copy (零copy)

以上是关于java NIO buffer --directBuffer 的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO 缓冲区(Buffer)

nio buffer用法

解读Java NIO Buffer

Java NIO —— Buffer(缓冲区)

Java NIO -- 缓冲区(Buffer)的数据存取

java nio buffer