一般高功用的涉及到存储结构,例如 RocketMQ,Kafka 这种音讯行列,存储日志的时分,都是经过 Java File MMAP 完结的,那么什rocketmq视频教程么是 Java File MMAP 呢?
什么是 Java File MMAP
虽然从JDK 1.4版别开始,Javarocketmq是啥 内存映射文件(Memory Mapped Figithub是干什么的les)就现已在java.nio
包中,但它对许多程算法与数据结构序开发者来说仍然是一个适当新的概念。引入 Nrocketmq布置IO 后,Java IO 现已适当快,而且内存映射文件供应了 Java 有或许达到的最快 IO 操作,这也是为什么那些高功用 Java 运用应该运用内存映射文件来耐久化算法与数据结构数据。 作为 NIO 的一个重要的功用,MMAPGit 方法为咱们供应了将文件RocketMQ的部分或全部映射到内存地址空间的才干,同当这块内存区域java是什么意思被写入数据之后会变成脏页,操作系统会操作系统的主要功用是用必定的算法把这些数据写入到文件中,而咱们的 Java 程gitlab序不需求去关心这些。这便是内存映射文件的一个算法工程师要害java初学优势,即便你的程序在刚刚写入内存后就挂了,操作系统仍然会将内存中的数据写入文件系统。 别的一算法工程师需求把握什么个更杰出的优势是同享内存,内存映射文件RocketMQ可以被多个进程一起拜访,起到一种低时延同享内存的效果。
Java File MMAP 与直接操作文件功用比照
package com.github.hrocketmq原理ashZhang.scanfold.jd算法的有穷性是指k.file;
impo操作系统当时的装备不能运行此应用程序rt java.io.RandomAccessFile;
import java.nio.ByteBuffer;
improcketmq是啥ort java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Random;
public class FileMmapTest {
public static void main(Stringgiticomfort是什么轮胎品牌[] argsJava) throws Exception {
//记录开始时刻
long start = System.currentTimeMillis();
//经过RandomAccessFile的方法获取文件的Channel,这种方法针对随机读写的文件较为常用,咱们用文件一般是随机gitee读写
RandomAccessFile randomAccessFile = new Rrocketmq集群andomAccesjava面试题sFile("./Filjava初学eMmapTest.txt", "rw");
FileChannel channel = randoGitmAccessFil操作系统有哪些e.getChanne算法工程师需求把握什么l();
System.out.println("FileChannel初始化时刻:" +rocketmq是啥 (System.currentTimeMillis() - start) + "ms");
//内存映射文件,方式是READ_WRITE,假如文件不存在,就会被创立
Mapp操作系统有哪些edByteBuffer mappedByteBuffer1 = channel.map(FileChannel.MapMode.READ_WRITE, 0, 128 * 1024 * 1024);
MappedByteBuffer mappedByteBuffer2 = channel.map(FileCha操作系统是一种nnel算法导论.MapMode.READ_WRITE, 0, 128 * 1操作系统装置与重装024 * 1024);
System.out.pGitrintln("MMAPFile初始化时刻:" + (System.currentTimeMillis() - start) + "ms");
start = System.currentTimeMillis();
testFileChanne操作系统的基本特征lSequentialRW(channel);
System.out.println("FileChjava游戏annel次序读写时刻:" + (Systemrocketmq集群.currentTimeMillis() - start) + "java游戏ms");
start = System.currentTimeMillis();
testFileMMapSequentialRW(mappedByteBuffer1, mappedByte操作系统Buffer2);
System操作系统是什么的接口.out.printlnjavascript("MMAPFile次序读写时刻:" + (System.currentTimeMigithubllis() - start) + "ms");
start = System.currentTim算法的有穷性是指eMirocketmq集群llis();
try {
testFileChannelRandomRW(channel);
System.out.prinrocketmq布置tln("FileChannel随机读写时刻:" + (System.currentTimeMillis() - start) + "ms");
} finally {
randomAccessFile.cgiti轮胎是什么品牌lose();git命令
}
//文件封闭不影响MMAP写入和读取
start = System.curgithub是干什么的rentTimeMillis();
testFileMMaprocketmq原理RandomRW(mappedByteBuffer1,rocketmq顺序消费 mappedByteBuffer2);
System.out.printlnjavascript("MMAPFile随机读写时刻:" + (System.currentTimeMillis() - start) + "ms");
}
pub算法工程师需求把握什么licJava static void testFileChannelSequentialRW(Fi算法是什么leChannel fileChannel) thr算法工程师需求把握什么ows Exception {
by算法工程师需求把握什么te[] bytes = "查验字符串1查验字符串1查验字符串1查验字符串1查验字符串1查验字符串1查验字符串1查验字符串1查验字符操作系统期末考试试题及答案串1查验字符串1查验字符串1"java是什么意思.getBytes();
byte[] tjavascripto = new byte[bytes.length];
//分配直接内存,减少仿制
ByteBuffer byteBuffer算法统宗 = ByteBuffer.allocateDirect(bytes.length);
//次序写入
for (int i = 0; i < 100000; i++) {
byteBuff操作系统是一种什么软件er.put(bytes);
byteBuffer.flip();
fgithub是干什么的ileChannel.writrocketmq装置e(byteBuffrocketmq源码er操作系统的主要功用是);
byteBuffer.flip算法的空间复杂度是指();java面试题
}
fileCrocketmq是啥hannel.position(0);
//次序读取
for (int i = 0; i < 100000; i++) {
fileChannel.read(byt算法是什么eBuffeJavar);
by操作系统当时的装备不能运行此应用程序teBu算法开始ffer.flip();
byteBuffer.get(to);
byteBuffer.rocketmq集群flip();
}
}
public static void teRocketMQstFileMMapSequentialRW(MappedByteBuffer majavascriptpped操作系统装置与重装ByteBuffer1, MappedByteBuffer mappedByteBuffer2) throws Exception {
byte[] bygiticomforttes = "查验字符串2查验字符串2查验字符串2查验字符串2查验字符串2查验字算法统宗符串2查验字符串操作系统期末考试试题及答案2查验字符gitee串2查验字符串2查验字符串2查验字符串操作系统是一种什么软件2".getBytes();
byte[] to = new byte[bytes.length];
//次序写入
for (int i = 0; i < 100000; i++) {
mappedByteBuffer1.put(bytes);
}
//次序读取
for (int i = 0; i < 100000; i++) {
mappedByteBuf操作系统当时的装备不能运行此应用程序fer2.get(to);
}
}
public stajavascripttic void testFileChannelRandomRW(FileChannel fileChannel) throws Exception {
try {
byte[] bytes = "javascript查验字符串1查验字符串1java怎样读查验字符串1查验字符串算法是什么1查验字符串1查验字符串1查验字符串1查验字符串1查验字符串1查验字符串1查验字Java符串1".get算法的空间复杂度是指Bytes();
byte[] to = new byte[bytes.length];
//分配直java就业培训班接内存,减少仿制
ByteBuffer byteBuffer = ByteBufgiticomfort是什么轮胎品牌fer.allocateDirect(bytes.length);
//随机写入
f算法工程师or (int i = 0; i < 100000; i++) {
byteBuffer.put(bytes);
byteBuffer.flip();
fileChannel算法的空间复杂度是指.position(new Random(i).nextInt(bytGites.length*100000));
fileChannel.write(bjavascriptyteBuffer);
byte算法工程师学什么专业Buffer.flip();
}
//随机读取
for (int i = 0; i < 100000; i++) {
fileChannel.position(new Random(i).nextInt(bytes.length*100000));
fileChannel.read(byteBuffer);
byteBuffergithub.flip();
byteBuf操作系统是什么的接口fer.get(to);
byteBuffer.flip();
}
} finally {
fileChannel.close();
}
}
pubjava是什么意思lic static void testFileMMapRandomRW(MappedByteBuffer map算法的有穷性是指pedByteBuffer1, MappedByteBuffer mappedByteBuffer2) throws Exception {
byte[] bytes = "查验字符串2查验字符串2查验字符串2查验字符串2查验字符串2查验字符串2查验字符串2查验字符串2查验字符串2查验字符串2查验字符串2".getBytes();
byte操作系统是什么的接口[] to = new byte[bytes.length];
//随机写入
for (int i = 0; i < 100000; i++) {
mappedByteBuffer1.position(new Random(i).nextInt(byte操作系统是一种s.length*100000));
mappedB算法统宗yteBuffer1.put(bytes);
}
//随机读取
for (int i算法的空间复杂度是指 = 0; i <java怎样读 100000; i++) {
mappedByRocketMQteBuffer2.position(new Random(i).nextInt(bytes.length*100000));
mappedgiticomfort是什么轮胎品牌ByteBuffer2.get(to);
}
}
}
在这里,咱们gitlab初始rocketmq原理化了一个文件,并把它映射到了128M的内存中。分FileChannel还有MMAP的方法,经过次序或随机读写,写了一些内容并读取一部分内容。
运转结果是:
FileChannel初始化时刻:7ms
MMAPFile初始操作系统装置与重装化时刻:8ms
FileChannel次序读算法写时刻:420ms
MMAPFile次序读写时刻:20ms
FileChannel随机读rocketmq是啥写时刻:860ms
MMAPFile随机读写时刻:45ms
可以看到,经过MMAP内存映射文件的方法操作文件,更加快速,而且功用进步的适当明显。
微信查找“我的编程喵”注重群众号,每日一刷,轻松进步技能,斩获各种offer