day2:将原来普通读取文件的方式改为内存映射文件的方式。

mmap 是一种内存映射文件的方法,即将一个文件映射到进程的地址空间,实现文件磁盘地址和一段进程虚拟地址的映射

Java 中的 mmap

Java 中原生读写方式大概可以被分为三种:普通 IO,FileChannel(文件通道),mmap(内存映射)。区分他们也很简单,例如 FileWriter,FileReader 存在于 java.io 中,他们属于普通 IO;FileChannel 存在于 java.nio 中,也是 Java 最常用的文件操作类;而今天的主角 mmap,则是由 FileChannel 调用 map 方法衍生出来的一种特殊读写文件的方式,被称之为内存映射。

mmap 的使用方式:

FileChannel fileChannel = new RandomAccessFile(new File("db.data"), "rw").getChannel();
MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, filechannel.size(); 

MappedByteBuffer 便是 Java 中的 mmap 操作类。

// 写
byte[] data = new byte[4];
int position = 8;
// 从当前 mmap 指针的位置写入 4b 的数据
mappedByteBuffer.put(data);
// 指定 position 写入 4b 的数据
MappedByteBuffer subBuffer = mappedByteBuffer.slice();
subBuffer.position(position);
subBuffer.put(data); // 读
byte[] data = new byte[4];
int position = 8;
// 从当前 mmap 指针的位置读取 4b 的数据
mappedByteBuffer.get(data);
// 指定 position 读取 4b 的数据
MappedByteBuffer subBuffer = mappedByteBuffer.slice();
subBuffer.position(position);
subBuffer.get(data); 

回收 mmap 内存

更正之前博文关于 mmap 内存回收的一个错误说法,回收 mmap 很简单。

((DirectBuffer) mmap).cleaner().clean(); 

详细请参考原作:重新认识 Java 中的内存映射(Mmap)-51CTO.COMmmap 是一种内存映射文件的方法,即将一个文件映射到进程的地址空间,实现文件磁盘地址和一段进程虚拟地址的映射。https://developer.51cto.com/article/689602.html

作业代码:

import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;public class day2 {public static void main(String[] args) throws IOException{String filePath = "src/picture/day1.png";FileChannel fileChannel = null;try {fileChannel = new RandomAccessFile(new File(filePath), "rw").getChannel();MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, fileChannel.size());byte[] bytes = new byte[64];mappedByteBuffer.get(bytes);print(bytes);mappedByteBuffer.position((int)fileChannel.size()-64);mappedByteBuffer.get(bytes);print(bytes);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if(fileChannel !=null){try {fileChannel.close();} catch (IOException e) {e.printStackTrace();}}}}public static  void print(byte[] bytes){for (int i = 0; i < bytes.length; i++) {System.out.printf("%02X ",bytes[i]);if((i+1)%8==0) System.out.print("\n");}System.out.println("-----------------");}}

Java 中的内存映射(Mmap)相关推荐

  1. Java 中的内存映射Mmap

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 mmap 前言 一.mmap基础概念? 二.mmap 内存映射原理 (一)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域 ...

  2. 内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败

    内存映射文件 写入 卡住 内存映射文件是一个很好的并且经常被忽视的工具. 我不会在这里详细介绍它们的工作方式(使用 力 Google Luke!),但我将快速总结其优势: 操作系统提供的延迟加载和写入 ...

  3. 在Java中使用内存映射文件时检测(写入)失败

    内存映射文件是一个很好的并且经常被忽视的工具. 我不会在这里详细介绍它们的工作方式(使用 力 Google Luke!),但我将快速总结其优势: 操作系统提供的延迟加载和写入缓存(您不必自己编写,并且 ...

  4. 重新认识 Java 中的内存映射(mmap)

    mmap 基础概念 mmap 是一种内存映射文件的方法,即将一个文件映射到进程的地址空间,实现文件磁盘地址和一段进程虚拟地址的映射.实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而 ...

  5. java 物理内存_聊聊Java中的内存

    JVM的内存 先放一张JVM的内存划分图,总体上可以分为堆和非堆(粗略划分,基于java8) 那么一个Java进程最大占用的物理内存为: Max Memory = eden + survivor + ...

  6. linux mmap 内存映射 mmap() vs read()/write()/lseek()

    From: http://www.perfgeeks.com/?p=723 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进 ...

  7. 进程间通信(IPC)之内存映射mmap和共享内存shm

    一.共享内存shm 1 概念:多个进程的地址空间都映射到同一块物理内存,这样多个进程都能看到这块物理内存,实现进程间通信,而且不需要数据的拷贝,所以速度最快. 二.内存映射mmap 1 前言:先介绍一 ...

  8. iOS之深入解析文件内存映射MMAP

    一.常规文件操作 常规文件操作(read/write)有以下重要步骤: 进程发起读文件请求: 内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此文件的 inode: inode ...

  9. Java中的内存溢出和内存泄漏

    内存泄漏是指程序在申请内存后,无法释放已申请的内存空间.内存溢出是指程序申请内存时,没有足够的内存供申请者使用:或者说提供一块存储int数据的存储空间,但存储了long数据,则结果是内存不够用,报错O ...

最新文章

  1. 一个历时五天的 Bug
  2. [HNOI2010 Planar平面图判定]
  3. java 分治法排序_分治法实现1-N的数字按字典序全排列组合 Java语言
  4. Zabbix Agent端配置文件说明
  5. 九种食物摆脱便秘烦恼 - 生活至上,美容至尚!
  6. 小波分析及相应MATLAB实现
  7. Python自然语言处理 3 处理原始文本
  8. 如何培养你自己独特的领导风格?
  9. Linux中用Nginx和FTP搭建图片服务器
  10. RESLAM/ REVO 编译 实时RGBD基于边缘的slam系统
  11. 用vc++穷举windows应用程序密码
  12. 线下活动 | 聚焦分布式高可用的消息队列
  13. 怎么在线预览.doc,.docx,.ofd,.pdf,.wps,.cad文件以及Office文档的在线解析方式。
  14. 阿里云大数据工程师ACP认证例题
  15. eclipse插件升级
  16. 学习linux压缩命令压缩文档
  17. 【开发环境】(基于Hexo)个人博客主题(Hexo Fluid)更换
  18. 智慧旅游在新时代背景下的功能建设详情
  19. 今天的样子,绝非偶然
  20. PMP备考指南之第十一章:项目风险管理

热门文章

  1. windows debug tools
  2. 微博第三方登录 php,php 网站使用微博第三方授权登录
  3. 用Android实现计算器
  4. Lamda C++11
  5. 2020第十一届蓝桥杯省赛C组第一场
  6. 第十届蓝桥杯C语言B组题解
  7. smarty模板使用详细教程
  8. 孟岩:区块链是一个与物理、互联网不同的平行世界,从互联网到区块链需要跨越5座桥
  9. spring jsm(一)
  10. 《Redis系列第三篇、incr与decr使用|CSDN创作打卡》