为什么保留的虚拟内存会增长,而当前正在使用的虚拟内存不会增长?

Why does reserved virtual memory grow while virtual memory currently in use doesn't grow?

本文关键字:虚拟内存 保留 为什么      更新时间:2023-10-16

我的应用程序得到bad_alloc异常。资源监视器显示操作系统(Commit)预留的虚拟内存超过2G。然而,进程(工作集)当前使用的虚拟内存非常小(在崩溃时可能在200000 Kb左右)。这是怎么发生的?我注意到,当程序启动时,这两个几乎是相同的大小(提交是稍微大一点)。但随着时间的推移,差异越来越大,在我看来,因为当第二个内存(工作集)增加时,第一个内存(提交)也会增加。但是当第二个能量减少时,第一个能量不会变回去。我用三台不同的电脑,到处都有这种行为。我使用的是Windows 7,程序是用c++编写的。

是什么导致了这样的行为?谢谢你

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

从内存管理的角度来看,它将有助于显示程序内部工作的粗略描述。

"工作集"是操作系统对应用程序可见的页面数量。操作系统总是试图减少它。

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