2021-2-23:Java 文件映射内存是如何更新到硬盘文件的,什么情况下会丢失?
16lz
2021-02-23
对于 Java MMAp,修改 MappedByteBuffer 就相当于修改了文件。之后操作系统根据优先搜索树的算法,通过pdflush
进程刷入磁盘。
就算我们的程序挂了,操作系统也会把这部分内存的脏页刷入磁盘。
但是如果系统挂了,重启等,这部分数据会丢失。
那我们有强制刷入磁盘的方法么?linux对应的系统调用是msync()函数(参考:http://man7.org/linux/man-pages/man2/msync.2.html)。对应的Java方法是`MappedByteBuffer.force()`,**不过使用这个方法会大幅度降低效率**,慎用!
MappedByteBuffer.java:
public final MappedByteBuffer force() { checkMapped(); if ((address != 0) && (capacity() != 0)) { long offset = mappingOffset(); //原生调用force0 force0(fd, mappingAddress(offset), mappingLength(offset)); } return this;}
MappedByteBuffer.c:
JNIEXPORT void JNICALLJava_java_nio_MappedByteBuffer_force0(JNIEnv *env, jobject obj, jobject fdo, jlong address, jlong len){ void* a = (void *)jlong_to_ptr(address); //调用msync int result = msync(a, (size_t)len, MS_SYNC); if (result == -1) { JNU_ThrowIOExceptionWithLastError(env, "msync failed"); }}
©著作权归作者所有:来自51CTO博客作者zhxdick的原创作品,如需转载,请注明出处,否则将追究法律责任微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer:
每一份赞赏源于懂得
赞赏
0人进行了赞赏支持
更多相关文章
- centos 将本地代码软链到web服务代码目录
- Netdata 新一代实时监控系统(3)
- 物理网卡故障,怎么办?
- 安装Jenkins,提示:stat: cannot stat ‘/var/cache/jenkins
- Windows 遍历查找文件夹文件
- jQuery AJAX 同步和异步的区别
- 远程克隆PDB
- pdb clone mos文档
- Spinnaker持续交付实战