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)
原文地址:https://www.cnblogs.com/iscys/p/9665602.html
时间: 2024-11-09 00:30:18