我设置了由系统管理的虚拟内存大小。虽然磁盘上有足够的空间,但我遇到了“内存不足”错误,这与我假设系统在这种情况下应该分配更多虚拟内存的假设相反。那么 Windows 自动虚拟内存分配策略是什么?此外,即使某些线程处于空闲状态,Windows 是否也要求单个进程使用的内存适合物理内存?
我的问题一般是针对 Windows x64 的(如果必须具体的话,那就是 Win 8.1、16GB RAM,进行科学计算)。
编辑:具体来说,这两个软件分别是 MATLAB R2015a (win64) 和 Gurobi 6.0.5 (win64)。它们都在不同情况下出现了这样的错误。我认为它们与 32 位软件无关。而且我认为这个错误只是意味着内存分配函数(比如 new 或 malloc)返回了一些无效的内容。
答案1
执行计算的进程很可能实际上是 32 位的。此类进程仅限于寻址最大 2GB 至 4GB,(取决于应用程序的编译方式)无论操作系统是 32 位还是 64 位。
如果应用程序使用 .NET 框架,则即使应用程序是 64 位的,也会有其他限制。除非你正在使用.NET 4.5 或更高版本那是。
最后,如果编码不当,即使是纯 64 位应用程序也会遇到问题。我见过 64 位应用程序崩溃,因为它们在内部仍使用 32 位变量来处理索引等内容。当您将此类应用程序推得太远(例如尝试插入第 4,294,967,297 个项目)时,即使有足够的 RAM 可用,您也难免会崩溃。
以下是一些MS 提供的良好文档关于 Windows 如何在必要时扩展页面文件:
当系统提交费用超过系统提交限制的 90% 时,页面文件将增加以支持它。这种情况将持续发生,直到页面文件达到物理内存大小的三倍或 4 GB(以较大者为准)。这一切都假设托管页面文件的逻辑磁盘足够大以适应增长。