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


本文分享自微信公衆號 - 我的編程喵(MyProCat)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章