Java NIO 堆外内存与零拷贝

时间:2021-11-16 03:11:47

一、直接缓存

Java NIO 堆外内存与零拷贝

这个例子的区别就是

ByteBuffer.allocateDirect(512);

进入allocateDirect方法

Java NIO 堆外内存与零拷贝

进入DirectByteBuffer构造函数

Java NIO 堆外内存与零拷贝

Native方法:unsafe.allocateMemory

public native long allocateMemory(long var1);

Java NIO 堆外内存与零拷贝

问题:为什么HeapByteBuffer要拷贝数据,而不是由操作系统之间操作这块数据?

因为JVM会进行垃圾回收,根据垃圾回收算法,被标记的控件会被回收,然后重新压缩,以便有更大的连续控件。

但是如果操作系统之间操作这块数据时,发生了GC,那数据就乱了。

如下图,标记X的是要回收的内存。

Java NIO 堆外内存与零拷贝