work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Java NIO 堆外内存与零拷贝

Posted on 2019-08-12 22:39  work hard work smart  阅读(489)  评论(0编辑  收藏  举报

一、直接缓存

这个例子的区别就是

 ByteBuffer.allocateDirect(512);

 

进入allocateDirect方法

 

进入DirectByteBuffer构造函数

Native方法:unsafe.allocateMemory

public native long allocateMemory(long var1);

 

 

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

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

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

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