我在看Java中的一些内存映射文件。假设我的堆大小设置为2gb,并且我的内存映射了一个50gb的文件 - 远远超过了机器上的物理内存。操作系统会将部分50gb文件缓存在os文件缓存中,java进程将拥有2GB的堆空间。我很好奇的是操作系统如何决定要缓存多少50gb文件?
例如,如果我有另一个java进程,也是2gb堆大小,那么2gb是否会被换出以允许os缓存部分内存映射文件?是否会交换第一个进程的部分堆空间以允许操作系统缓存?
有没有办法告诉操作系统不要交换堆空间进行操作系统缓存?如果操作系统没有交换主进程,它如何确定其文件缓存应该有多大?
答案 0 :(得分:2)
Linux并没有真正区分匿名页面和内存映射页面。无论如何,它们都会因页面错误而加载需求。
您可以将匿名内存视为/ dev / zero的私有内存映射。
所以你可以根据需要绘制任意数量的地图(地址空间允许,但我假设你在这里是一个64位的盒子)。 Linux只在进程触及它们时通过页面错误加载它们。
同样,它会记录最近页面的使用情况,以便将它们排除在外。
如果您的文件映射是MAP_SHARED文件映射,唯一的区别是为了获得更多空间而被丢弃的页面不必写入交换区域,它们只能从原始文件中读回来文件。
因此,在回答您的问题时,不,如果您不读取或写入页面,映射大文件将不会使虚拟内存远离任何人。