繁体   English   中英

当物理内存中的可用空间非常小时,Windows仍然能够分配内存吗?

[英]Will Windows be still able to allocate memory when free space in physical memory is very low?

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

可以说,我的计算机上正在运行许多其他应用程序,它们已经占用了几乎所有的物理内存,并且仅剩1 MB内存可用。 如果我的应用程序(尚未分配任何内存)尝试分配2 MB,则调用是否成功?

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

Windows坚决保证这将始终有效。 仅当Windows可以在页面文件中分配空间以进行分配时,进程才能分配虚拟内存。 如有必要,它将增加分页文件以提供空间。 如果失败,例如当分页文件超过预设的限制时,分配也会失败。 Windows没有Linux的“ OOM杀手”,它不支持过量提交,这可能要求操作系统启动随机杀进程来寻找RAM。

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

当然。 如果现在必须浪费内存以便以后使用,那就太糟糕了。 操作系统随时会不断地将内存重新利用到其最有利的用途。 他们不必只是为了使其空闲而浪费内存,以便以后使用。

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

但是,一旦达到RAM 页面文件的限制,就完成了,那时内存不足的情况才真正变得有趣。

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

至于虚拟内存,无论您的RAM或页面文件大小如何,您都可以请求更多可用资源。 仅当您提交内存时,它实际上才需要一些支持-RAM或页面文件。 在64位上,您可以轻松请求TB的虚拟内存-这并不意味着您尝试提交时会得到它,尽管:P

这是带有页面文件的虚拟内存的好处之一。 因为内存是虚拟的,所以系统可以分配比物理内存更多的虚拟内存。 无法容纳在物理内存中的虚拟内存被推出到页面文件中。

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

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

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

这显然比这复杂得多。

有几种方法可以在Windows上配置页面文件(固定大小,可变大小以及在哪个磁盘上)。 如果物理内存不足,硬盘空间不足(由于过多的“分页”而使页面文件变得很大)或达到页面文件的限制(如果是静态限制),则您的应用程序因内存不足异常而失败 但是,对于当今具有大型本地存储的系统,这是罕见的事件。

确保阅读有关整个图片的分页。 查看:

http://en.wikipedia.org/wiki/分页

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM