Java MemoryMapped文件的功能

Java MemoryMapped文件的功能

在JDK 1.4中,将内存映射文件的有趣功能添加到Java中,该功能允许将任何文件映射到OS内存以进行有效读取。 内存映射文件可用于开发IPC类型的解决方案。 本文是使用内存映射文件创建IPC的实验。

有关内存映射文件的一些详细信息,来自WIKI的定义

内存映射文件是虚拟内存的一部分,已为其分配了与文件或类文件资源的某些部分直接的逐字节关联。 此资源通常是物理上存在于磁盘上的文件,但也可以是设备,共享内存对象或操作系统可以通过文件描述符引用的其他资源。 一旦存在,文件和内存空间之间的这种关联关系允许应用程序将映射的部分当作主内存一样对待。

样例程序

下面我们有两个Java程序,一个是作者,另一个是读者。 写入者是生产者,尝试写入“内存映射”文件,读取者是使用者,它从内存映射文件中读取消息。 这只是一个示例程序,向您展示了这个想法,它不能处理许多极端情况,但足以在内存映射文件的顶部构建内容。

MemoryMapWriter

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;public class MemoryMapWriter {public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException {File f = new File("c:/tmp/mapped.txt");f.delete();FileChannel fc = new RandomAccessFile(f, "rw").getChannel();long bufferSize=8*1000;MappedByteBuffer mem =fc.map(FileChannel.MapMode.READ_WRITE, 0, bufferSize);int start = 0;long counter=1;long HUNDREDK=100000;long startT = System.currentTimeMillis();long noOfMessage = HUNDREDK * 10 * 10; for(;;){         if(!mem.hasRemaining()){start+=mem.position();mem =fc.map(FileChannel.MapMode.READ_WRITE, start, bufferSize);}mem.putLong(counter); counter++;if(counter > noOfMessage )break; }long endT = System.currentTimeMillis();long tot = endT - startT;System.out.println(String.format("No Of Message %s , Time(ms) %s ",noOfMessage, tot)) ;  }}

MemoryMapReader

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;public class MemoryMapReader {/*** @param args* @throws IOException * @throws FileNotFoundException * @throws InterruptedException */public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException {FileChannel fc = new RandomAccessFile(new File("c:/tmp/mapped.txt"), "rw").getChannel();long bufferSize=8*1000;MappedByteBuffer mem = fc.map(FileChannel.MapMode.READ_ONLY, 0, bufferSize);long oldSize=fc.size();long currentPos = 0;long xx=currentPos;long startTime = System.currentTimeMillis();long lastValue=-1;for(;;){while(mem.hasRemaining()){lastValue=mem.getLong();currentPos +=8;}if(currentPos < oldSize){xx = xx + mem.position();mem = fc.map(FileChannel.MapMode.READ_ONLY,xx, bufferSize);continue;   }else{long end = System.currentTimeMillis();long tot = end-startTime;System.out.println(String.format("Last Value Read %s , Time(ms) %s ",lastValue, tot));System.out.println("Waiting for message");while(true){long newSize=fc.size();if(newSize>oldSize){oldSize = newSize;xx = xx + mem.position();mem = fc.map(FileChannel.MapMode.READ_ONLY,xx , oldSize-xx);System.out.println("Got some data");break;}}   }}}}

观察

使用内存映射文件对于开发进程间通信可能是一个很好的选择,对于生产者和消费者而言,吞吐量也相当不错。 由生产者和消费者共同运行的性能统计信息:

每条消息是一个长号

产生– 1000万条消息– 16个

消费者– 1000万条消息0.6(s)

一条非常简单的消息用于说明您的想法,但是它可以是任何类型的复杂消息,但是当存在复杂的数据结构时,序列化会增加开销。 有许多技术可以克服这些开销。 下一个博客中的更多内容。

参考:来自Java的JCG合作伙伴 Ashkrit Sharma 的Java MemoryMapped File的功能,在Are you ready博客上。

翻译自: https://www.javacodegeeks.com/2013/05/power-of-java-memorymapped-file.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

介绍一款好用 mongodb 可视化工具

最近想自己搭建一个个人博客&#xff0c;所以学了下mongodb&#xff0c;mongodb是用命令行输入的&#xff0c;有些人可能不太习惯&#xff0c;我自己找了下mongodb的一些可视化工具&#xff0c;发现了一款adminmongo很好用&#xff0c;这里介绍给你们用一下。 github地址&#…

用CSS3来代替JS实现交互

【CSS3和JS】 对于CSS了解的同学都知道&#xff0c;CSS的实现是最底层的&#xff0c;在实现方式和性能上都不是&#xff0c;JS这种提供接口的脚本可比的&#xff1b;从CSS3的动画和JS动画对比角度来看两者&#xff0c;会更清晰&#xff1b;而且随着前端框架的使用&#xff0c;…

php 如何宏定义,php – 在html中实现宏定义的方法

也许显而易见,但C预处理器可以完成这项工作.index._html#define _em(a) a #define _image(a, b) #define _list(a, b, c) a \\ b \ c \#define _theTile The Bar Title#include "head._html"_list(foo, bar, bean)This is really _em(great)_image(media/cat.jpg, …

python——函数 11、命名空间

三种名称空间1、内置名称空间&#xff1a; python解释器自带的名字,如&#xff1a;print、sum、max 当解释器启动时就会形成这个空间 2、全局名称空间&#xff1a; 执行python程序时就会产生这个空间 在每行顶端写代码 a10 def foo():print(a) foo() View Code3&…

Hadoop如何工作? HDFS案例研究

Apache Hadoop软件库是一个框架&#xff0c;该框架允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理。 它旨在从单个服务器扩展到数千台机器&#xff0c;每台机器都提供本地计算和存储。 库本身不用于依靠硬件来提供高可用性&#xff0c;而是被设计用来检测和处…

CS Round#53 E Maxor

题意&#xff1a;给你N个数&#xff0c;你可以从中选出两个数将它们or起来得到M&#xff0c;求M的最大值及得到最大值的方案数。 刚了半个小时得到了一个貌似时O(N log max(Ai)^2)的方法&#xff0c;想了想发现貌似只能做出第一问&#xff0c;但好像改一下就能搞掉第二问&#…

CSS小记录

1.让图文不可复制 -webkit-user-select: none; -ms-user-select: none; -moz-user-select: none; -khtml-user-select: none; user-select: none; 2.让图片垂直居中 .Logo{height: 109px;line-height: 109px;} .Logo img{vertical-align: middle;} 3.行内块级元素垂直居中&…

Java如何避免重量级锁,Java 中锁是如何一步步膨胀的(偏向锁、轻量级锁、重量级锁)...

文章目录重量级锁(Mutex Lock)偏向锁(比较 ThreadID)偏向锁获取过程偏向锁的释放轻量级锁(自旋)轻量级锁的加锁过程轻量级锁的释放总结重量级锁(Mutex Lock)Synchronized 是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的 Mute…

使用镜像源安装EASY_INSTALL和PIP教程

使用easy_install和pip可以让python的模块的安装和管理变得非常方便。我一般在新的Linux系统上&#xff0c;先easy_install pip然后就用pip安装其他的模块了。 不过&#xff0c;在国内用官方的pypi源&#xff08;https://pypi.python.org/simple&#xff09;一般比较慢&#xf…

Flexbox布局

Flexbox布局 刚开始接触flex布局的时候&#xff0c;只知道它可以用来使子元素水平垂直居中&#xff0c;代码最为简洁好用。 .container {display: flex;justify-content: center;align-items: center; } 当然不仅仅是居中问题&#xff0c;flexbox能做的事情大多&#xf…

臭名昭著的Java错误和陷阱

在2000年&#xff0c;我上大学&#xff0c;濒临选择一种语言来发展自己的职业。 Java尚未成为主流&#xff0c;但很受人们欢迎。 与静态html页面相比&#xff0c;小应用程序&#xff08;尚未破碎&#xff09;花哨且富有光泽。 Swing不是构建桌面应用程序的不错选择。 J2EE越来越…

php oracle 配置,关于php:为Windows 64位配置Oracle OCI8

我一直在为Windows配置oracle oci8时遇到问题我正在使用Windows 7 64位&#xff0c;xampp v3.2.2&#xff0c;php 5.6.15和oracle g11 Express我尝试了以下步骤&#xff0c;但是在运行phpinfo时找不到oci软件包&#xff1a;我同时下载了Instant Client Package-Basic和Instant …

CSS_常见布局

1.一列布局——常用于网站首页。 html&#xff1a; 1 <div class"top"></div> 2 <div class"main"></div> 3 <div classfoot></div> css&#xff1a; 1 body{2 margin:0;3 padding: 0;4 …

解决android studio引用远程仓库下载慢(JCenter下载慢)

原文&#xff1a;https://blog.csdn.net/linglingchenchen/article/details/62236723 第一种方法 使用开源中国的maven库 阿里云的(速度飞快)&#xff1a;http://maven.aliyun.com/nexus/content/groups/public/ 替换项目根目录下build.gradle中的 repositories {jcenter()} 为…

Java中的工厂方法模式

在我以前关于模板方法模式的文章中 &#xff0c;我展示了如何利用lambda表达式和默认方法 。 在本文中&#xff0c;我将探讨工厂方法模式&#xff0c;并了解如何利用方法引用&#xff0c;这是Java 8中与lambda表达式一起添加的另一项功能。 让我们考虑一个Vehicle接口及其两个…

会员系统用php框架,代码基地会员中心的PHP签到系统结合thinkphp框架

分享代码基地会员中心的PHP签到系统&#xff0c;PHP很漂亮的签到界面。签到后&#xff0c;会有不同颜色区分。附带PHP签到源码带安装说明和详细注释。(详细查看https://www.daimajidi.com/deal/574)JS:function getUrl(strs) {var url "/demo/1563064903/" strs;re…

MVP数据请求recycview展示

M层 public class Mod {public void shuju(final Modlister modlister){ OkHttpClient okHttpClientnew OkHttpClient();final Request requestnew Request.Builder().url("http://v.juhe.cn/weixin/query?key55010ae808217e996bbf414bbdad843c").build(); Call …

impress.js

介绍一下 impress.js是一个非常炫酷的幻灯片展示框架&#xff0c;依靠CSS3技术。 impress.js使用起来非常简单&#xff0c;下面就来简单介绍一下其用法。 Start 首先&#xff0c;当然要引入impress.js。 在div标签设置id为impress&#xff08;不要求一定是div&#xff09;…

Spring MVC:表单处理卷。 1个

Spring MVC是Spring Framework的一部分&#xff0c;其主要目的是使Web开发更加简单&#xff0c;便捷和轻松。 与表单的交互是或多或少现代Web应用程序的一部分。 Spring MVC允许您以非常严格和简单的方式执行各种形式的活动。 在本文中&#xff0c;您将在Spring MVC的帮助下阅读…

用php打出前一天的时间格式,[php]用PHP打印出前一天的时间格式

echo date("Y-m-d H:i:s",strtotime("-1 day"));例子echo(strtotime("now"));echo(strtotime("3 October 2005"));echo(strtotime("5 hours"));echo(strtotime("1 week"));echo(strtotime("1 week 3 days 7 …