最近,为了保证我的电脑不被将来淘汰,我在原来的 4GB 内存基础上又增加了内存。我将总内存增加到了 8GB,但速度并没有明显变化——即使应该有变化。我查看了任务管理器,发现我的电脑内存使用量不会超过 4GB,即使同时打开 Chrome 和 Firefox,每个都打开了 20 个标签。
经过研究,每个人都建议检查有多少内存可用。奇怪的是,它说我有 8GB 内存,但可用内存为 7.74GB。
我的 HP Pavilion g7-1075dx 的规格可在此处找到。 这是一款搭载 Windows 7 Home Premium 64 位操作系统和 AMD Phenom II 的笔记本电脑。
我的主要问题是:对于我的 64 位计算机,为什么我的计算机不使用超过 4GB 的内存,即使有超过 7GB 的内存可用?
编辑:如果有帮助,资源监视器将所有其他 RAM 描述为“待机”
答案1
如果有帮助的话,资源监视器会将所有其他 RAM 描述为“待机”
“待机” RAM是正在使用中。它被用作页面缓存(它保存所有进程工作集中最近丢失的页面;也就是说,这些页面的页面错误可以在不进入磁盘的情况下得到解决),并且还被 SuperFetch 用作主动文件缓存。
它被认为是“可用的”,因为备用页面不必写入磁盘即可分配给其他用途。例如,当某个进程遇到页面错误时做需要从磁盘读取,必须为该进程分配新的物理页面,如有必要,可以从备用列表中获取这些页面。(这不是为此目的查找页面的首选,应该是空闲页面列表,然后是零页面列表。)
换句话说,您的系统正在正常运行。
您可以使用命令行工具轻松地强制系统让更多 RAM 进入“使用中”状态testlimit
,该工具是Windows 内部原理。它不是常规 sysinternals 工具的一部分,但与它们相关联;找到它这里在 sysinternals 站点。下载内容是一个 zip 文件,其中包含两个版本,testlimit.exe 和 testlimit64.exe。这两个版本都链接了大地址感知,因此 32 位版本将能够在使用 /3GB 启动的 32 位计算机上分配最多 3 GiB,在 64 位计算机上分配最多 4 GiB。
c:\> testlimit -?
给予帮助。
c:\> testlimit -d 4 -c 512
将尝试分配 2 GiB 进程专用虚拟地址空间,共 512 个分配,每个分配 4 MiB。这在 64 位机器上应该可以正常工作。在 32 位机器上不是使用 /3GB 启动(大多数都不是)它可能会稍早出现错误,因为进程中已经有几个 MiB 的东西(比如程序本身、所有 DLL 等),所以没有足够的 2 GiB 可供程序分配。
在这两种情况下,“可用” RAM 都会减少,“正在使用” RAM 会增加,但不一定值 2 GiB因为无法保证操作系统会将所有 2 GiB 留在进程私有工作集中。即使它在短期内这样做,您稍后也可能会发现进程工作集减少,因为操作系统会决定“嗯,你实际上并没有用它做任何事情,其他进程更需要它”并将其分页。
过多地增加分配“块”的大小,从而相应地减少块的数量,并且可能会更快失败,因为每个分配必须几乎连续。例如,尝试在 4 GiB 地址空间中找到七个 512 MiB 块,您很可能会失败。
如果你使用 l(eak) 选项而不是 d(irty),程序将分配虚拟空间,但永远不会引用它。这将不是导致“可用” RAM 明显减少。
(d(irty) 选项的名称来自 x86/x64 页表条目中的“脏页位”,当使用“修改”样式的操作数访问相应的虚拟页时,该选项会被设置,这意味着页面的内容已被更改。这是 Windows 的指示,如果必须将页面从进程工作集中逐出,则必须先将其内容保存在某个地方,然后才能将页面用于其他用途。设置了“脏”位的页面在被逐出后会立即进入“修改页面列表”;从那里,Windows 将它们写入各自的后备存储器。)
您需要有足够的“提交”才能使这些测试按上述方式运行(即使对于 l(eak) 选项也是如此,尽管此选项不会使用任何可观的 RAM 量)。具体来说,在开始测试之前,您的“提交限制”应至少比“提交费用”高 2 GiB(或您分配的金额)。请注意,即使您使用的是 l(eak) 选项,这也适用,而不仅仅是 d(irty)。如果您遇到此限制,您将看到“系统内存不足”弹出窗口或类似内容。当然,解决方法是添加更多 RAM 和/或增加页面文件设置。
答案2
实际上,可以配置 Windows 以限制 RAM 使用量。我不知道谁或如何配置您的笔记本电脑上的此设置,但您应该检查:
这文章有更多详细信息,但进入上述对话框很容易:
答案3
您可以使用SysInternals 内存映射看看 PC 到底对你做了什么身体的RAM。其他工具(如任务管理器或进程资源管理器)主要关注虚拟的记忆并不是这种情况的最佳工具。
在“使用计数”选项卡中,您可能会看到,当您没有打开太多应用程序时,很大一部分都未被使用。
这并不意味着您的 PC 会一直处于这种状态。只需打开几个程序,内存就会被使用。
答案4
Windows 会做一些聪明的事情,比如分页内存。它可能认为您正在执行的大多数任务都是不必要的,并决定将大量内容转储到页面文件中,使其看起来像是为了避免耗尽所有 RAM 而这样做。您可以通过禁用分页来测试这个理论,尽管这不是您应该永久配置的功能。互联网上有很多教程可以做到这一点。它所做的一件事(即使在我的 24GB 和 64GB 机器上)是在达到约 50%、80% 和 90% 的消耗时使分页规则更加严格(这些数字是近似值)。我注意到在每个阶段都会将大量内容转储到页面文件中。
一件有趣的事情可能是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PAGE_SZ (1<<12)
int main() {
int i;
int gb = 2; // memory to consume in GB
for (i = 0; i < ((unsigned long)gb<<30)/PAGE_SZ ; ++i) {
void *m = malloc(PAGE_SZ);
if (!m)
break;
memset(m, 0, 1);
}
printf("allocated %lu MB\n", ((unsigned long)i*PAGE_SZ)>>20);
getchar();
return 0;
}
这是一些 C 代码。获取 GCC 或某些编译器,为自己制作一个 exe,然后观察内存消耗的增加。如果您想消耗超过 2GB 的内存,则需要编译并作为 64 位进程运行。如果您对此感兴趣,这可能是一个有趣的实验,至少 :)
编辑:只是想指出程序不会因此而死掉。我根据以前的一些代码对其进行了编辑,因为我不确定其他代码是否会起作用(内存将被分页,导致不消耗内存,哈哈)。新代码包含一行int gb = 2; // memory to consume in GB
- 更改 2 将调整程序应消耗的内存量,因此您可以将其设置为使用您想要的内存量。将其设置为高于系统所拥有的值可能会导致它崩溃(未经测试,因此请谨慎使用)