NIO和Netty系列(三): 堆外内存与零拷贝详解

2 篇文章 0 订阅
2 篇文章 0 订阅

在之前的文章中我们了解到NIO中堆外内存的实现类是java.nio.DirectByteBufferjava.nio.MappedByteBuffer。本文中我们也通过这两个类来分析NIO中堆外内存的实现。

如何从Java code获取堆外内存

我们都知道Java code是运行在JVM进程所管理的内存上的,而堆外内存是JVM进程所管控的内存之外的,那么如何从Java代码中获取对外内存呢?在Java层面管理堆外内存的实现类是DirectByteBuffer

DirectByteBuffer继承自MappedByteBufferMappedByteBuffer是个抽象类,继承自ByteBufferByteBuffer继承了Buffer类。ByteBuffer提供了一个allocateDirect方法来分配堆外内存:

public static ByteBuffer allocateDirect(int capacity) {
     return new DirectByteBuffer(capacity);
}

因此从Java code角度只需要ByteBuffer buffer = ByteBuffer.allocate(1024)即可获取到一块堆外内存,调用ByteBuffer相关api就可以操作这块堆外内存了。

此外java.nio.channels.FileChannel也提供了一个获取堆外内存的方法:

public abstract MappedByteBuffer map(MapMode mode,
                                         long position, long size) throws IOException;

该方法用于将一个文件映射到一块堆外内存。此后操作这块内存就像直接操作文件一样,map一般通过如下方式使用:

// 创建一个文件
FileInputStream fis = new FileInputStream("NonHeapMem.txt");
FileChannel fileChannel = fis.getChannel();
MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, fileChannel.size());

获取到mappedByteBuffer对象后就可以调用MappedByteBuffer相关api直接操作文件了。

参考

深入浅出 MappedByteBuffer

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值