2010-04-05 98 views
1

我正在看Java中的一些内存映射文件。假设我有一个堆大小设置为2GB,我的内存映射一个50GB的文件 - 远远超过机器上的物理内存。操作系统会将该50GB文件的一部分缓存在os文件缓存中,java进程将拥有2GB的堆空间。我很好奇的是操作系统如何决定要缓存多少50GB文件?例如,如果我有另一个java进程,也有一个2gb堆大小,将2gb换出来允许os缓存部分内存映射文件吗?第一个进程的堆空间部分是否会被换出以允许操作系统缓存?Java内存映射文件和交换

有什么办法可以告诉操作系统不要交换操作系统缓存的堆空间吗?如果操作系统没有交换出主进程,它如何确定文件缓存应该有多大?

回答

2

Linux并没有真正区分匿名和内存映射页面。无论如何,它们都会通过页面错误获得需求负载。

您可以将匿名内存视为/ dev/zero的私有内存映射。

因此,您可以根据需要映射尽可能多的任何东西(地址空间允许,但我假设您位于64位盒中)。 Linux只在进程通过页面错误触及它们时才加载它们。

同样,它保留了最近页面的使用情况的一些记录,因此它们被优先处理以便被丢弃。

如果你的文件映射是MAP_SHARED,唯一的区别是为了获得更多空间用于其他事情而丢弃的页面不必写入交换区域,它们可以从原始文件。

因此,在回答您的问题时,如果您不读取或写入页面,映射大型文件不会将任何人的虚拟内存带走。