计算机使用的 RAM 不超过 8GB 中的 4GB……?(64 位计算机)

计算机使用的 RAM 不超过 8GB 中的 4GB……?(64 位计算机)

最近,为了保证我的电脑不被将来淘汰,我在原来的 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 使用量。我不知道谁或如何配置您的笔记本电脑上的此设置,但您应该检查:

最大柱塞设置

文章有更多详细信息,但进入上述对话框很容易:

  1. 单击“开始”图标并msconfig.exe在搜索框中输入

    如何启动 msconfig

  2. 启动 msconfig.exe,单击Boot选项卡,然后单击Advanced Options...按钮,您将进入:

    msconfig 启动设置对话框

  3. 输入一个合理的值,例如 8GB RAM 输入 8192,或者完全取消选中该Maximum memory复选框,这样 Windows 就会使用您所有的 RAM。我肯定会尝试这两个选项。

    最大内存设置

答案3

您可以使用SysInternals 内存映射看看 PC 到底对你做了什么身体的RAM。其他工具(如任务管理器或进程资源管理器)主要关注虚拟的记忆并不是这种情况的最佳工具。

在“使用计数”选项卡中,您可能会看到,当您没有打开太多应用程序时,很大一部分都未被使用。

SysInternals 内存映射

这并不意味着您的 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 将调整程序应消耗的内存量,因此您可以将其设置为使用您想要的内存量。将其设置为高于系统所拥有的值可能会导致它崩溃(未经测试,因此请谨慎使用)

相关内容