1、MappedByteBuffer是DirectByteBuffer的子类

2、MappedByteBuffer使用的是mmap技术。MappedByteBuffer将文件映射为内存,也可能会被存储在虚拟内存里面,访问的时候通过缺页机制调进内存。

3、mmap可以实现两个进程之间共享数据 http://kenby.iteye.com/blog/1164700

4、mmap原理   http://blog.chinaunix.net/uid-26669729-id-3077015.html

5、MappedByteBuffer有一个文件释放问题,文件是在full gc的时候才会关闭   http://langgufu.iteye.com/blog/2107023

6、MappedByteBuffer能优化随机读(因为实际上会在内存里存放大量的页/块)

metaq在文件读写操作上做了一定的优化,使用内存映射的方式完成读写,替代了传统的IO操作,从而大大的减少了文件读写系统调用的次数,提升了IO的性能。

传统的文件访问:

  • 系统调用打开文件,获取文件描述符
  • 使用read write 系统调用进行IO
  • 系统调用关闭文件

这种方式是非常低效的, 每一次I/O操作都需要一次系统调用。 另外, 如果若干个进程访问同一个文件, 每个进程都要在自己的地址空间维护一个副本, 浪费了内存空间

内存映射的方式:

  • 打开文件,得到文件描述符。
  • 获取文件大小
  • 把文件映射成虚拟内存(mmap)
  • 通过对内存的读写来实现对文件的读写(memset或memcpy)
  • 卸载映射
  • 关闭文件

首先建立好虚拟内存和磁盘文件之间的映射(mmap系统调用),当进程访问页面时产生一个缺页中断,内核将页面读入内存(也就是说把磁盘上的文件拷贝到内存中),并且更新页表指向该页面。
所有进程共享同一物理内存,物理内存中可以只存储一份数据,不同的进程只需要把自己的虚拟内存映射过去就可以了,这种方式非常方便于同一副本的共享,节省内存。
经过内存映射之后,文件内的数据就可以用内存读/写指令来访问,而不是用Read和Write这样的I/O系统函数,从而提高了文件存取速度。

package com.ydd.study.hello.mmap;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
/**
* 内存映射文件
* @author yunzhu.ydd
*
*/
public class MapedFile {
private final String FILE_NAME = "D://mapedFile.txt";
private final long fileSize = 1024 * 1024;// 1M
private FileChannel fileChannel;
private MappedByteBuffer mappedByteBuffer;
private File file;
public MapedFile() throws IOException {
this.file = new File(FILE_NAME);
this.fileChannel = new RandomAccessFile(this.FILE_NAME, "rw")
.getChannel();
//产生一定大小的文件,byte默认都为0。也就是说文件的byte都被初始化为0了
this.mappedByteBuffer = this.fileChannel.map(MapMode.READ_WRITE, 0,
fileSize);
}
/**
* 写
* @param str
*/
public void write(String str)
{
mappedByteBuffer.put(str.getBytes());
}
/**
* 读文件
*/
public void getAll()
{
System.out.println("capacity:"+mappedByteBuffer.capacity());
for(int i=0;i<mappedByteBuffer.capacity();i++)
{
char c=(char)mappedByteBuffer.get(i);
if(c!=' '&&c!=0)
System.out.print(c);
}
System.out.println();
}
/**
* 通过MappedByteBuffer操作文件
* @throws IOException
*/
public void test_写和读() throws IOException
{
System.out.println("capacity:"+mappedByteBuffer.capacity());
write("hello world");
getAll();
fileChannel.close();
}
/**
* MappedByteBuffer.slice()生成的是DirectByteBuffer,对该buffer写操作会被直接写到文件里面
* @param str
* @throws IOException
*/
public void test_slic_写和读(String str) throws IOException
{
ByteBuffer buffer=mappedByteBuffer.slice();
buffer.put(str.getBytes());
System.out.println("mappedByteBuffer.clice产生的buffer类型为:"+buffer.getClass());
getAll();
fileChannel.close(); }
public static void main(String[]a) throws IOException
{
MapedFile mappedFile=new MapedFile();
//mappedFile. test_写和读();
mappedFile.test_slic_写和读("hahahahahah");
} }

mmap和MappedByteBuffer的更多相关文章

  1. java中的mmap实现--转

    什么是mmap mmap对于c程序员很熟悉,对于java程序员有点陌生.简而言之,将文件直接映射到用户态的内存地址,这样对文件的操作不再是write/read,而是直接对内存地址的操作. 在c中提供了 ...

  2. Kafka-4614问题复盘 (MappedByteBuffer未关闭导致慢磁盘访问)

    很早之前就想动笔就这个kafka bug总结一番了,只是这个问题既不是本人发现,也不是自己动手修复,终归是底气不足,故而一直耽搁下来.怎奈此问题实在是含金量十足,又恰逢最近有人询问Kafka 0.10 ...

  3. IO的详细解释:It's all about buffers: zero-copy, mmap and Java NIO

    There are use cases where data need to be read from source to a sink without modification. In code t ...

  4. MappedByteBuffer以及ByteBufer的底层原理

    最近在用java中的ByteBuffer,一直不明所以,尤其是对MappedByteBuffer使用的内存映射这个概念云里雾里. 于是首先补了物理内存.虚拟内存.页面文件.交换区的只是:小科普——物理 ...

  5. Android mmap 文件映射到内存介绍

    本文链接: Android mmap 文件映射到内存介绍 Android开发中,我们可能需要记录一些文件.例如记录log文件.如果使用流来写文件,频繁操作文件io可能会引起性能问题. 为了降低写文件的 ...

  6. 2021-2-25:对于 Java MMAP,如何查看文件映射脏页,如何统计MMAP的内存大小?

    我们写一个测试程序: public static void main(String[] args) throws Exception { RandomAccessFile randomAccessFi ...

  7. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

  8. Python之mmap内存映射模块(大文本处理)说明

    背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...

  9. MMAP和DIRECT IO区别

    看完此文,题目不言自明.转自 http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的东西,技术人员非常关 ...

随机推荐

  1. No-11.变量进阶

    变量进阶 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递 ...

  2. Hibernate中get()与load()的区别,以及关于ThreadLocal的使用方法

    一.get方法和load方法的简易理解 (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时 ...

  3. ThinkPHP5.0-多语言切换

    这两天做得项目中需要多语言切换,于是乎就看了看文档,感觉有些乱,就使用了终极必杀--百度. 借鉴了网上各位大佬所集成.整理出一篇比较适合类似我这种比较菜的随笔吧. 请各位大佬轻虐.感谢. 首先,不说其 ...

  4. 调用 C 动态库

    调用 C 动态库 由 王巍 (@ONEVCAT) 发布于 2015/11/04 C 是程序世界的宝库,在我们面向的设备系统中,也内置了大量的 C 动态库帮助我们完成各种任务.比如涉及到压缩的话我们很可 ...

  5. 智能指针之 weak_ptr

    1. weak_ptr 介绍 std::weak_ptr 是一种智能指针,它对被 std::shared_ptr 管理的对象存在非拥有性("弱")引用.在访问所引用的对象指针前必须 ...

  6. ECshop二次开发 ECSHOP首页显示积分商城里的商品

    以ECSHOP2.7.2官方默认模板为基础 1).首先打开 index.php 文件,在最末尾增加下面函数,注意千万不要写到 “?>” 的外面去,要加在“?>”的前面,加以下代码: /** ...

  7. (2)zabbix硬件需求

    1. 硬件需求 无非就是cpu.内存.硬盘之类的1.1 CPU由你的zabbix数据库使用情况来做决定,如果你监控的项目越多,那你的cpu要越好.具体多好,下面有个表格 1.2 内存与硬盘最基本的需求 ...

  8. FIFO设计思考之一

    不管同步FIFO还是异步FIFO,设计难点是full/empty状态flag的正确性. 要保证任何情况 FULL时NO WRITE,EMPTY时NO READ.overflow / underflow ...

  9. 【linux】 【网络】【转发】服务器版自定义安装无法有线上网问题

  10. Lex与Yacc学习(五)之正则表达式篇

    正则表达式语法 lex模式是由编辑程序和实用程序使用的正则表达式的扩展版本.正则表达式由常规字符(代表它们本身)和元字符(在一种模式中具有特殊含义)组成. 元字符 . . 匹配除了换行符 \n 之外的 ...