【发布时间】:2012-06-05 16:22:24
【问题描述】:
我有一个 C++ 应用程序,我正试图解决内存泄漏问题,但我意识到我并不完全理解虚拟内存和物理内存之间的区别。
top 的结果(因此 16.8g = 虚拟,111m = 物理):
4406 um 20 0 16.8g 111m 4928 S 64.7 22.8 36:53.65 client
我的进程拥有 500 个连接,每个用户一个,在这些数字上,这意味着每个用户大约有 30 MB 的虚拟开销。在不深入了解我的应用程序的细节的情况下,如果我不知道虚拟内存的实际含义,那么将所有向量、结构、线程、堆栈上的函数等加在一起听起来很现实的唯一方法是。顺便说一句,没有 -O 优化标志。
所以我的问题是:
- C++ 中的哪些操作会使虚拟内存膨胀这么多?
- 如果我的任务正在使用 gigs 虚拟内存,会不会有问题?
- 堆栈和堆函数变量、向量等 - 这些是否必然会增加物理内存的使用?
- 消除内存泄漏(通过
delete或free()等)是否一定会减少物理和虚拟内存的使用?
【问题讨论】:
-
您是否尝试过使用像 valgrind 这样的内存分析器?使用 top 检查是否有泄漏并不理想。
-
我的同事告诉我,考虑到我们正在使用的库,valgrind 已经非常没用了(我还需要自己对此进行调查......这是待办事项)。现在,我正在尝试了解我正在尝试获取的实际数字并在源代码分析级别工作 - 当这变得毫无结果时,我将引入工具。
-
无优化 = 您的数据无关紧要。
-
@DeadMG - 据我了解 -O1 和 -O2 优化速度并增加任务规模。因此,如果我在关闭它们的情况下遇到任务大小问题,那么开启它们只会变得更糟。
标签: c++ memory memory-leaks ram virtual-memory