我正在查看Java中的一些内存映射文件。假设我将堆大小设置为2 2gb,并且内存映射了一个50 2gb的文件-远远超过机器上的物理内存。OS将在os文件高速缓存中高速缓存50 2gb文件部分,java进程将具有2 2gb的堆空间。我好奇的是,操作系统是如何决定缓存多少50 to的文件的?
例如,如果我有另一个java进程,同样具有2 2gb的堆大小,这2 2gb会被换出以允许操作系统缓存内存映射文件的某些部分吗?第一个进程的堆空间的一部分是否会被换出以允许操作系统进行缓存?
有没有办法告诉OS不要将堆空间交换为OS缓存?如果操作系统不换出主进程,它如何确定其文件缓存应该有多大?
发布于 2010-04-06 05:54:59
Linux实际上并不区分匿名页和内存映射页。无论如何,它们都是通过页面错误进行按需加载的。
您可以将匿名内存看作是/dev/zero的私有内存映射。
因此,您可以根据需要映射任何内容(地址空间许可,但我假设您在这里使用的是64位机器)。Linux仅在进程通过页面错误接触到它们时才加载它们。
同样,它保留了一些页面最近被使用的记录,以便它们在被丢弃时被优先处理。
如果您的文件映射是MAP_SHARED映射,唯一的区别是为了获得更多空间而丢弃的页面不必写入交换区,它们只需从原始文件读回即可。
所以对于你的问题,答案是否定的,映射一个大文件不会占用任何人的虚拟内存,前提是你不读写页面。
https://stackoverflow.com/questions/2581094
复制相似问题