Java内存映射文件和交换

Java内存映射文件和交换,java,linux,memory-management,Java,Linux,Memory Management,我正在看一些Java中的内存映射文件。假设我将堆大小设置为2gb,并且我映射了一个50gb的文件,远远超过机器上的物理内存。操作系统将把50gb文件的一部分缓存在操作系统文件缓存中,java进程将有2gb的堆空间。我想知道的是,操作系统是如何决定要缓存多少50gb文件的 例如,如果我有另一个java进程,堆大小也是2gb,是否会将2gb换掉,以允许操作系统缓存内存映射文件的一部分?第一个进程的部分堆空间是否会被交换以允许操作系统缓存 有没有办法告诉操作系统不要将堆空间交换给操作系统缓存?如果操作

我正在看一些Java中的内存映射文件。假设我将堆大小设置为2gb,并且我映射了一个50gb的文件,远远超过机器上的物理内存。操作系统将把50gb文件的一部分缓存在操作系统文件缓存中,java进程将有2gb的堆空间。我想知道的是,操作系统是如何决定要缓存多少50gb文件的

例如,如果我有另一个java进程,堆大小也是2gb,是否会将2gb换掉,以允许操作系统缓存内存映射文件的一部分?第一个进程的部分堆空间是否会被交换以允许操作系统缓存


有没有办法告诉操作系统不要将堆空间交换给操作系统缓存?如果操作系统不交换主进程,它如何确定其文件缓存应该有多大?

Linux并没有真正区分匿名页面和内存映射页面。不管怎样,它们都是通过页面错误加载请求的

您可以将匿名内存看作是/dev/zero的私有内存映射

因此,您可以映射任意多的内容(地址空间许可,但我假设您位于64位框中)。Linux仅在进程通过页面错误接触它们时才将其加载

类似地,它保存了一些最近页面使用情况的记录,以便为被丢弃的页面确定优先级

如果您的文件映射是一个MAP_共享的映射,唯一的区别是被丢弃的页面不必写入交换区域,它们可以从原始文件读回

因此,在回答您的问题时,如果您不读或写页面,映射一个大文件不会从任何人那里拿走虚拟内存