当物理内存中的可用空间非常低时,Windows是否仍能分配内存?

时间:2014-06-04 08:00:12

标签: windows memory memory-management virtual-memory

在Windows 32位系统上,正在使用Visual Studio开发应用程序:

假设我的机器上运行了很多其他应用程序,它们几乎占用了所有物理内存,只剩下1 MB内存。如果我的应用程序(尚未分配任何内存)尝试分配,比如说2 MB,那么呼叫是否会成功?

我的猜测:从理论上讲,每个Windows应用程序都有2GB的可用虚拟内存。 所以我相信这个调用应该是成功的(无论有多少物理内存可用)。但我不确定这一点。这就是为什么要问这里的原因。

5 个答案:

答案 0 :(得分:2)

Windows提供了坚如磐石的保证,这将始终有效。当Windows可以在分页文件中提交空间以进行分配时,进程只能分配虚拟内存。如有必要,它将增加页面文件以使空间可用。如果失败,例如当页面文件超出预设限制时,分配也会失败。 Windows没有相应的Linux“OOM杀手”,它不支持过度提交,可能需要操作系统开始随机查杀进程以找到RAM。

请注意“始终有效”条款确实存在刺痛。无法保证这需要多长时间。在非常极端的情况下,机器可以开始抖动,在运行进程中几乎每个内存访问都会导致页面错误。代码执行速度变慢,爬行时,当资源管理器或鼠标或视频驱动程序开始抖动时,鼠标指针会冻结,您可能会失去控制权。当发生这种情况时,你已经远远超过购买RAM的程度了。 Windows将配额应用于进程以防止它们占用机器,但如果您有足够的进程运行,则不一定能避免此问题。

答案 1 :(得分:0)

当然。如果现在不得不浪费内存以便以后使用,那将是糟糕的设计。操作系统在任何时刻都不断地将存储器重新用于其最有利的用途。他们不必浪费记忆,只是为了以后可以使用它。

答案 2 :(得分:0)

嗯,只要有一些内存,它就会成功 - 除了物理内存,还有页面文件。

但是,一旦达到RAM 页面文件的限制,当内存不足的情况真正开始变得有趣时,您已经完成了这项工作。< / p>

现在,像Windows Vista这样的系统将尝试使用所有可用内存,几乎用于缓存。这是一件好事,当有来自应用程序的内存请求时,缓存将根据需要丢弃。

对于虚拟内存,无论RAM或页面文件大小如何,您都可以请求比可用内容更多的内容。只有当你提交内存时,它才真正需要一些支持 - 无论是RAM还是页面文件。在64位上,您可以轻松地请求数TB的虚拟内存 - 但这并不代表您在尝试提交虚拟内存时会得到它,但是:P

答案 3 :(得分:0)

这是带有页面文件的虚拟内存的好处之一。由于内存是虚拟的,因此系统可以分配比物理内存更多的虚拟内存。无法放入物理内存的虚拟内存被推送到页面文件中。

因此,您的系统可能正在使用所有物理内存这一事实并不意味着您的程序将无法分配内存。在您描述的场景中,您的2MB内存分配将成功。如果您随后访问该内存,虚拟内存将被分页到物理内存,很可能其他一些页面(可能在您的进程中,可能在另一个进程中)将被推送到页面文件。

答案 4 :(得分:0)

如果您的应用程序无法分配物理内存(RAM)块来存储信息,操作系统将接管“页面”或存储磁盘上RAM中的部分以释放物理内存,以便您的程序能够执行分配。这是自动完成的,对您的应用程序完全透明。

因此,在您的示例中,在具有1MB RAM可用空间的系统上,如果您的应用程序尝试分配内存,操作系统会将物理内存的某些内容分页到磁盘并为您的应用程序释放RAM。在这种情况下,您的申请不会崩溃。

这显然要复杂得多。

在Windows上配置页面文件有多种方法(固定大小,可变大小和在哪个磁盘上)。如果物理内存耗尽,硬盘空间不足(因为页面文件由于过多的“分页”而变得非常大)或达到分页文件的限制(如果它是静态限制)那么应用程序<由于内存不足异常,strong>将失败。然而,今天的系统具有大型本地存储,这是一种罕见的事件。

请务必阅读有关分页的完整图片。退房:

http://en.wikipedia.org/wiki/Paging

在某些情况下,您会注意到您有足够的可用物理内存。说100MB,你的程序试图分配一个10MB的块来存储一个大对象但是失败了。这是由物理内存碎片引起的。虽然可用内存为100MB,但没有单个10MB的连续块可用于存储您的对象。这将导致需要在代码中处理的异常。如果在代码中分配大对象,则可能需要将分配分成较小的块以便于分配,然后将它们聚合回代码逻辑中。例如,您可以在数组中声明10 x 1m向量,并为每个向量分配内存,而不是使用单个10米向量。