Java 中的内存映射(Mmap)
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)相关推荐
- Java 中的内存映射Mmap
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 mmap 前言 一.mmap基础概念? 二.mmap 内存映射原理 (一)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域 ...
- 内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败
内存映射文件 写入 卡住 内存映射文件是一个很好的并且经常被忽视的工具. 我不会在这里详细介绍它们的工作方式(使用 力 Google Luke!),但我将快速总结其优势: 操作系统提供的延迟加载和写入 ...
- 在Java中使用内存映射文件时检测(写入)失败
内存映射文件是一个很好的并且经常被忽视的工具. 我不会在这里详细介绍它们的工作方式(使用 力 Google Luke!),但我将快速总结其优势: 操作系统提供的延迟加载和写入缓存(您不必自己编写,并且 ...
- 重新认识 Java 中的内存映射(mmap)
mmap 基础概念 mmap 是一种内存映射文件的方法,即将一个文件映射到进程的地址空间,实现文件磁盘地址和一段进程虚拟地址的映射.实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而 ...
- java 物理内存_聊聊Java中的内存
JVM的内存 先放一张JVM的内存划分图,总体上可以分为堆和非堆(粗略划分,基于java8) 那么一个Java进程最大占用的物理内存为: Max Memory = eden + survivor + ...
- linux mmap 内存映射 mmap() vs read()/write()/lseek()
From: http://www.perfgeeks.com/?p=723 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进 ...
- 进程间通信(IPC)之内存映射mmap和共享内存shm
一.共享内存shm 1 概念:多个进程的地址空间都映射到同一块物理内存,这样多个进程都能看到这块物理内存,实现进程间通信,而且不需要数据的拷贝,所以速度最快. 二.内存映射mmap 1 前言:先介绍一 ...
- iOS之深入解析文件内存映射MMAP
一.常规文件操作 常规文件操作(read/write)有以下重要步骤: 进程发起读文件请求: 内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此文件的 inode: inode ...
- Java中的内存溢出和内存泄漏
内存泄漏是指程序在申请内存后,无法释放已申请的内存空间.内存溢出是指程序申请内存时,没有足够的内存供申请者使用:或者说提供一块存储int数据的存储空间,但存储了long数据,则结果是内存不够用,报错O ...
最新文章
- 一个历时五天的 Bug
- [HNOI2010 Planar平面图判定]
- java 分治法排序_分治法实现1-N的数字按字典序全排列组合 Java语言
- Zabbix Agent端配置文件说明
- 九种食物摆脱便秘烦恼 - 生活至上,美容至尚!
- 小波分析及相应MATLAB实现
- Python自然语言处理 3 处理原始文本
- 如何培养你自己独特的领导风格?
- Linux中用Nginx和FTP搭建图片服务器
- RESLAM/ REVO 编译 实时RGBD基于边缘的slam系统
- 用vc++穷举windows应用程序密码
- 线下活动 | 聚焦分布式高可用的消息队列
- 怎么在线预览.doc,.docx,.ofd,.pdf,.wps,.cad文件以及Office文档的在线解析方式。
- 阿里云大数据工程师ACP认证例题
- eclipse插件升级
- 学习linux压缩命令压缩文档
- 【开发环境】(基于Hexo)个人博客主题(Hexo Fluid)更换
- 智慧旅游在新时代背景下的功能建设详情
- 今天的样子,绝非偶然
- PMP备考指南之第十一章:项目风险管理