何时使用虚拟内存(Windows)?
Posted
技术标签:
【中文标题】何时使用虚拟内存(Windows)?【英文标题】:when will virtual memory be used (windows)? 【发布时间】:2013-07-26 19:57:32 【问题描述】:我正在调试一个程序崩溃,因为没有连续的内存可用于需要重新分配的向量。所以我有一个问题,为什么没有使用虚拟内存?虚拟内存可以通过什么方式使用?谢谢。
【问题讨论】:
重新分配需要多少内存? 你知道什么是虚拟内存吗? 【参考方案1】:操作系统会自动使用虚拟内存。你不需要关心这个。
在您的情况下,您最有可能运行的是 32 位应用程序。 Windows 中 32 位进程的用户地址空间限制为 2 GB(如果 Windows 使用特定密钥启动,则为 3 GB)。如果您的向量需要超过数百兆字节的连续地址空间,这可能会成为一个问题(由于地址空间碎片)。
当然,任何进程都可能耗尽内存(即使在使用虚拟内存和交换文件等时)。在任务管理器中查看程序的内存使用情况。
【讨论】:
当前使用了300MB内存,需要重新分配。是的,它是 32 位应用程序。谢谢。【参考方案2】:虚拟内存是您作为在现代操作系统(Linux、Unix、Windows、MacOS、Symbian 等)上运行的程序所获得的唯一内存。
听起来您的问题是没有一个连续的虚拟地址范围足以容纳您的向量 [1]。我怀疑正在发生的事情是,比如说,在 32 位进程中需要超过 1.5GB,而它一次只能使用 2GB,所以两端都没有太多“空间”可以在“中间”小于 1.5GB - 特别是,如果您有一个正在增长的向量,您将需要该向量的两个副本,一个是当前大小,另一个是要复制到的两倍大小。
一个简单的解决方案,假设您知道向量需要多大,就是设置它的大小,例如vector<int> vec(some_size);
如果你不知道,还有一些解决方法:
如果您有 64 位操作系统,您可以尝试为可执行文件设置 LARGEADDRESSAWARE
标志(假设它是 Windows)。这应该会给你更多的内存,因为 64 位操作系统不必为操作系统本身保留一大块内存空间(它位于 32 位地址范围之外。在 32 位操作系统中) ,你需要用 /3GB 启动操作系统,并设置上面的标志。
或者将代码编译为 64 位(如果需要,在升级到 64 位操作系统之后)。
[1] 当然,除非您正在编写驱动程序并尝试分配数兆字节的物理内存作为用于 DMA 的缓冲区 - 但我认为您会这么说。
【讨论】:
【参考方案3】:问题与内存无关,甚至与虚拟内存无关。一个数组需要一个连续的地址范围。地址空间(在 Win32 程序中通常为 2 GB)是碎片化的,因此没有足够大的可用空间。
如果你能得到地址,Windows 会自动提供虚拟内存来配合它们。
是时候将您的应用程序提升到 64 位了。
【讨论】:
以上是关于何时使用虚拟内存(Windows)?的主要内容,如果未能解决你的问题,请参考以下文章