对于 Java MMAp,修改 MappedByteBuffer 就相当于修改了文件。之后操作系统根据优先搜索树的算法,通过pdflush
进程刷入磁盘。 就算我们的程序挂了,操作系统也会把这部分内存的脏页刷入磁盘。 但是如果系统挂了,重启等,这部分数据会丢失。
那我们有强制刷入磁盘的方法么?linux对应的系统调用是msync()函数(参考:man7.org/linux/man-p…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