系统相关
首页 > 系统相关> > 2021-2-23:Java 文件映射内存是如何更新到硬盘文件的,什么情况下会丢失?

2021-2-23:Java 文件映射内存是如何更新到硬盘文件的,什么情况下会丢失?

作者:互联网

对于 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 JNICALL
Java_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

image

标签:文件,刷入,Java,msync,23,void,MappedByteBuffer,jlong
来源: https://blog.51cto.com/11418075/2633838