为什么部分满的 RAM(比如说 80%)会导致设备严重滞后,即使还有一些空间可以存储更多数据?我的预期是它在 99% 之前都能正常工作。
我注意到移动设备上的情况比 PC 上更严重,因为移动设备的 RAM 较小,例如我的移动设备有 2 GB RAM;当我的可用 RAM 不足 1 GB 时,它会非常滞后!为什么会发生这种情况,即使它仍然有大约 1 GB 可用?
答案1
这里涉及很多内容,但我会尝试尽可能简单地解释它,并且以适用于任何操作系统的方式进行。
这里有两个基本原则:
所有需要放在 RAM 中的内容和那些从放在 RAM 中受益的内容的总和几乎总是大于 RAM 的大小。从放在 RAM 中受益的内容包括进程工作集和待机列表。后者包含曾经处于活动状态但后来处于非活动状态的数据和代码。其中大部分将再次使用,其中一些很快就会使用,因此将其保留在 RAM 中是有益的。这种内存充当一种缓存,但并非真正必不可少,因此属于可用内存类别。与空闲内存一样,它可以快速提供给任何需要它的程序。为了提高性能,待机内存应该很大。
内存块的使用频率远非随机,但可以相当准确地预测。内存被分成多个块,通常为 4K 字节。有些块每秒被访问多次,而其他块在系统运行时间足够长的情况下,已经很多分钟、几小时、几天甚至几周没有被访问过。这两个极端之间的使用范围很广。内存管理器知道哪些块最近被访问过,哪些没有。合理的假设是,最近被访问过的内存块很快就会再次需要。最近没有被访问过的内存可能在短期内不会需要。长期的经验证明这是一个有效的原则。
内存管理器利用第二个原则来大大减轻第一个原则带来的不良后果。为此,它会采取一种平衡措施,将最近访问的数据保存在 RAM 中,而将很少使用的数据保存在原始文件或页面文件中。
当 RAM 充足时,这种平衡很容易实现。许多最近不常用的数据可以保存在 RAM 中。这是一个好的情况。
当工作量增加时,事情会变得更加复杂。使用的数据和代码总量变大,但 RAM 的大小保持不变。这意味着其中较小的子集可以保存在 RAM 中。一些最近较少使用的数据不能再保存在 RAM 中,而必须保留在磁盘上。内存管理器会尽力在活动内存和可用内存之间保持良好的平衡。但随着工作量的增加,内存管理器将被迫为正在运行的进程提供更多可用内存。这不是一个好的情况,但内存管理器别无选择。
问题是,在程序运行时将数据移入和移出 RAM 需要时间。当 RAM 充足时,这种情况不会经常发生,甚至不会被注意到。但是当 RAM 使用率达到高水平时,这种情况会更频繁地发生。情况可能会变得非常糟糕,以至于将数据移入和移出 RAM 所花的时间比实际使用数据所花的时间还要多。这就是内存抖动,内存管理器会尽力避免这种情况,但在高负载下,这种情况往往无法避免。
内存管理器站在你这边,总是尽力在不利条件下保持最佳性能。但是当工作量很大而可用内存不足时,它必须做一些坏事才能继续运行。事实上,这是最重要的事情。当务之急是先让系统运行,然后让系统尽可能快。
答案2
所有现代操作系统都会使用未使用的内存来缓存数据,以便可以从快速 RAM 而不是较慢的存储中访问数据。它们通常会将此报告为可用内存,因为应用程序可以清除缓存并在需要时使用它,但实际上仍在使用。缓存越少,可以缓存的数据就越少,计算机的速度就越慢。
答案3
此答案大部分内容已重写,以重新组织结构并使信息更清晰。我还将其作为社区 wiki 答案开放;欢迎随意编辑。
分页是一种内存管理方案,通过该方案,固定大小的内存块被分配给进程。当内存使用率上升到较高水平(即容量的 80%)时,分页开始从 RAM 扩展到 vRAM(虚拟 RAM)。
vRAM 位于系统存储中,通常在硬盘或其他相当大的存储位置内。
进程被分配了硬盘的一部分作为内存运行,并会将其部分视为 RAM。这是一个非常正常的过程,但是,当将数据传输到 vRAM 和从 vRAM 传输数据所花费的时间增加时,系统性能会下降。
虽然专用 RAM 可以通过主板从 CPU 直接访问,从而提供快速连接,但虚拟 RAM 必须在主板和 vRAM 位置之间进行横向布线。
然而,这只会对性能造成轻微影响。当 vRAM 的分页速率急剧增加时(当专用 RAM 接近容量时),就会发生抖动。
抖动是指快速将内存页面传输到虚拟内存中。这会对性能造成巨大影响,因为需要花费更多时间来获取和寻址数据。
假设您要写下一个 30 位长的数字。您可以坐在屏幕旁边,拿着记事本写下它(使用专用内存),或者记住 5 个数字,然后跑到隔壁房间,把它写在记事本上(使用虚拟内存)。这两种方法都可以完成任务,但哪种方法更快呢?
详细了解在这里!
答案4
请记住,硬盘是一个数量级慢点比 RAM 快,而且 RAM 本身一开始就不是那么快(在整体架构中)。按访问速度排序(其中每个梯级都比上面的梯级慢一个数量级),你有
- 处理器寄存器- 实际上,寄存器可用1 个处理器周期内。考虑到处理器每秒可执行数十亿次循环(3 GHz = 每秒 30 亿次循环),这个速度快得令人难以置信。
- 处理器缓存- 取决于级别,但这些仍然非常快(L1 缓存有 3-5 个周期可用性)。
- 随机存取存储器(RAM)- 随机部分意味着您在访问它时不知道它处于什么状态。想象一下一个包裹送货员必须停下来,拿起包裹,走到门口按门铃并等待回应。也许你根本不等,或者你等了一两分钟,让史密斯太太拖着脚步走到房子后面的门口。实际上,我们谈论的是 14-27 个周期(取决于我们访问 RAM 时它的状态)。
- 硬盘驱动器- 现在有一个物理过程,虽然它尽可能快地发生,但你正在等待磁头移动,磁道在磁头下移动。实际上,7,200 RPM 硬盘可以在大约 4 毫秒内完成一圈旋转或附近3 GHz 处理器为 750,000 次循环。太慢了。
虚拟内存管理器就像一个赌徒。它赌你不会一直用光所有的内存,所以它做出了有根据的猜测,并掷骰子说你的文档程序(当你读这篇文章时,它已经在后台运行了 10 分钟)并不重要,然后它就把文件推到硬盘上。
但是,然后您单击返回文档!现在 VMM 必须从 HDD 加载所有数据。更糟糕的是,如果您的 RAM 不足,它现在必须将其他数据(更多赌博)推送到 HDD 以释放可用空间。Linux 喜欢在这里处于边缘。它将用常用数据填充绝大多数 RAM(非常适合进程较少的服务器)。