我的问题似乎很简单。我的计算机使用的物理内存比我所有程序实际占用的内存还要多。
!(运行 Windows 8.1,最新补丁)
我使用了 7.5 GB。总使用量为 12GB。Delta 为 4.5 GB。我认为这非常高。
我在这个网站上找到的大多数帖子都与驱动程序内存泄漏有关,这些泄漏影响了“分页池”和“非分页池”,导致使用率过高。但是我的页面 + 非分页池大约为 650MB,据我所知,这并不比“正常”值高太多,不应该导致这个 4.5GB 的增量。为了进一步调查这个问题,我甚至运行了一下,poolmon.exe
发现按使用情况排序时没有发现这样的泄漏驱动程序。
所以我的问题很简单:怎么回事?你的记忆在哪里?
更新:
一位好心的用户向我推荐了程序 rammap,它提供了更详细的内存分配描述。运行它后,我发现“正在使用”部分中的 2GB 内存分配给了“映射文件”,我推测这是磁盘缓存。进入“物理页面”选项卡并按所述文件排序后,我了解到许多活动映射文件是托管大型数据文件的 torrent 应用程序正在使用的文件。终止该应用程序会将 1.2GB 的磁盘缓存释放到“待机”状态,从而得到下面的屏幕截图。
“增量”已降至 3.2 GB,这越来越接近我认为的正常值,但仍然偏高,不过,如果你减去“映射文件” 800MB 的剩余部分,最终会得到 2.4GB,可以可以通过任务管理器中列出的用户数量不正确来简单解释。
有了这些信息,我现在就不那么确定了。是不是只是我不了解内存核算?表中的“可共享”部分是否实际上由用户程序使用,只是没有在任务管理器中的用户空间中说明?如果是这样,那么这个问题可能是因为我不知道磁盘缓存可以计入“正在使用”/“活动”内存,以及任务管理器中的用户选项卡不准确。
答案1
与几乎所有现代操作系统一样,Windows 8 会不遗余力地使用尽可能多的内存。为什么?因为任何未使用的内存都会被永远浪费。
如果系统有 8GB 内存,但只使用了 7GB,则不会有任何好处。以后也无法使用 9GB。只要这 1GB 内存可用,系统就永远失去了从这额外的 1GB 中获得的任何好处。
例如,假设您的系统有大量可用 RAM,并且您正在运行某个程序。当程序完成时,系统有两个选择。它可以将程序(磁盘上的实际可执行文件)保留在内存中,也可以释放保存程序文件的内存。
如果它释放了内存,它就必须费力地释放它。如果它想再次使用该内存,它就必须费力地解除释放。而且如果再次执行该程序,它必须从磁盘加载。真是太恶心了。
如果它不释放内存,它就不必费力释放它。如果它想将该内存用于其他目的,它不必费心解除释放,从而节省了一个步骤。如果再次执行该程序,则不必从磁盘加载它。三赢。当然,由于当前没有进程正在运行该程序,因此内存不会与任何进程相关联。
因此,您的系统拥有足够的可用内存,因此可以非常高效地运行,无需浪费精力不必要地释放内存,也无需浪费精力来释放内存以便使用。相反,它可以高效地将内存从一种用途转换为另一种用途,如果恰好需要该内存中的数据,则可以避免磁盘 I/O。
这是全方位的胜利。内存存储着系统希望将来某个进程可能发现有用的数据,并且还避免了不必要的访问空闲内存列表以释放内存,然后又必须将其标记为已使用。现代操作系统只需要保留非常少量的空闲内存,足以处理紧急情况(例如页面错误和中断代码的内存请求),在这种情况下,它无法轻松地将内存从一种用途转换为另一种用途。