为什么预留的虚拟内存增长而当前使用的虚拟内存不会增长?

时间:2011-07-14 23:30:37

标签: c++ windows memory-management memory-leaks

我的应用程序获取bad_alloc异常。 资源监视器显示OS(Commit)保留的虚拟内存超过2G。 但是,进程(工作集)当前使用的虚拟内存非常小(崩溃时可能大约为200000 Kb)。 怎么会发生?我注意到,当程序启动时,这两个几乎具有相同的大小(Commit更大一些)。但随着时间的推移差异越来越大,在我看来,因为当第二个记忆(工作集)增加时,第一个(提交)也会增加。但是当第二个减少时,第一个不会回来。 我使用三台不同的计算机,到处都有这种行为。我使用的是Windows 7,程序是用C ++编写的。

什么可能导致这种行为? 谢谢

2 个答案:

答案 0 :(得分:1)

这有时是由应用程序的内存分配模式引起的。例如,如果您的数据结构总是在增长,并且推迟删除先前的缓冲区(那些用完空间的缓冲区),那么您可以使用堆来观察此行为。这是因为当你的程序试图分配更大的内存块时,它在实际缓冲区之前没有空间,所以它必须增加分配的堆来分配更大的块。也许之后你删除旧的缓冲区,但堆已经增加了。也许甚至在另一个循环之后,你使用释放的内存碎片,再次为下一个更大的块留下足够的空间,依此类推,因此内存耗尽。

有助于在内存管理方面粗略描述程序的内部工作原理。

答案 1 :(得分:0)

“工作集”是操作系统对您的应用程序可见的页面数量。操作系统会一直尝试减少它。

如果您分配内存而不使用它,则工作集会很小。但是,您分配的内存无论如何都必须适合您应用程序的虚拟地址空间。