对于 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");    }}

微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer

©著作权归作者所有:来自51CTO博客作者zhxdick的原创作品,如需转载,请注明出处,否则将追究法律责任

每一份赞赏源于懂得

赞赏

0人进行了赞赏支持

更多相关文章

  1. centos 将本地代码软链到web服务代码目录
  2. Netdata 新一代实时监控系统(3)
  3. 物理网卡故障,怎么办?
  4. 安装Jenkins,提示:stat: cannot stat ‘/var/cache/jenkins
  5. Windows 遍历查找文件夹文件
  6. jQuery AJAX 同步和异步的区别
  7. 远程克隆PDB
  8. pdb clone mos文档
  9. Spinnaker持续交付实战

随机推荐

  1. Android开发规范
  2. Android 安全测试书单
  3. delphi xe5 android 关于文件大小的几个
  4. Android(安卓)用sax解析xml文件
  5. You are attempting to build with the i
  6. 自学Android系列 笔记2 Android_Relative
  7. android 4.2里面增加遥控器按键的方法
  8. Android AIDE入门——Hello,world,用andr
  9. Windows下Android平台搭建_3
  10. Android仿微信朋友圈上传图片