为什么保留的虚拟内存会增长,而当前正在使用的虚拟内存不会增长?
Why does reserved virtual memory grow while virtual memory currently in use doesn't grow?
我的应用程序得到bad_alloc异常。资源监视器显示操作系统(Commit)预留的虚拟内存超过2G。然而,进程(工作集)当前使用的虚拟内存非常小(在崩溃时可能在200000 Kb左右)。这是怎么发生的?我注意到,当程序启动时,这两个几乎是相同的大小(提交是稍微大一点)。但随着时间的推移,差异越来越大,在我看来,因为当第二个内存(工作集)增加时,第一个内存(提交)也会增加。但是当第二个能量减少时,第一个能量不会变回去。我用三台不同的电脑,到处都有这种行为。我使用的是Windows 7,程序是用c++编写的。
是什么导致了这样的行为?谢谢你
这有时是由应用程序的内存分配模式引起的。例如,如果您的数据结构总是在增长,并且延迟一段时间删除以前的缓冲区(那些耗尽空间的缓冲区),那么您可以在堆中观察到这种行为。这是因为当您的程序尝试分配更大的内存块时,它在实际缓冲区之前没有空间,因此它必须增加已分配的堆以分配更大的块。也许之后你删除了旧的缓冲区,但是堆已经增加了。甚至可能之后,在另一个循环中,您使用的释放的内存块再次没有为下一个更大的块留下足够的空间,以此类推,因此内存耗尽。
从内存管理的角度来看,它将有助于显示程序内部工作的粗略描述。
"工作集"是操作系统对应用程序可见的页面数量。操作系统总是试图减少它。
如果您分配内存而不使用它,则工作集将很小。但是无论如何,您分配的内存必须适合应用程序的虚拟地址空间。
相关文章:
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- 为什么我只能在 4 GB 的虚拟内存空间上分配 2 GB?
- AWS pandas 安装出现错误:虚拟内存已耗尽:无法分配内存
- 如何判断虚拟内存页是否已锁定
- 如何使用一个 VirtualFree 调用删除多个相邻的虚拟内存分配?
- Windows 32 位 mfc 应用程序的虚拟内存中的地址
- 如何将x64机器代码写入虚拟内存并在C++中为Windows执行
- 读取虚拟内存时C++缓冲区溢出
- 在 Linux C++ 中获取虚拟内存最大映射计数
- GlobalMemoryStatusEx() 提供的总虚拟内存为 127 TB
- 在虚拟内存中分配大型类C
- 程序C++中的虚拟内存大小增加
- CC1PLUS:虚拟内存耗尽
- Linux的VirtualQueryEx替代方案-如何获得另一个进程的虚拟内存范围
- 在Linux中,多个进程使用文件指针读取文件时使用的共享虚拟内存
- 我已经将虚拟内存设置为20GB,但由于内存不足,代码仍然无法工作
- C++/Win32 在虚拟内存中创建文件
- 如何确定为我的程序保留了多少虚拟内存
- 为什么保留的虚拟内存会增长,而当前正在使用的虚拟内存不会增长?
- 释放 Windows 上C++ 'new'保留的虚拟内存