0

我想通过观察“Windows 任务管理器”进程选项卡来发现 C++ 程序的内存泄漏(使用 Windows 7 操作系统)以逐渐增加内存。我很困惑,因为我在下面的“Windows 任务管理器”进程选项卡中看到了很多与内存相关的列。内存 - 工作集内存 - 工作集增量内存 - 私有工作集内存 - 提交大小内存 - 分页池内存 - 非分页池

我在网上搜索了与此相关的主题,但我无法得到满意的答案。

请让我知道我应该使用哪个指标来检查内存增加,以便我可以确定我的 C++ 代码\进程是否存在内存泄漏。

仅供参考我的限制是;我不能使用任何分析工具或静态代码分析器工具,只能在系统上访问 Windows 任务管理器来查找内存泄漏。

4

3 回答 3

4

正如其他海报所说,缓慢增加和小幅增加并不一定表明有问题。

但是,如果您有一个长时间运行的进程,它慢慢消耗的内存比理论上应该需要的多得多(或者已经在类似使用场景下的健康版本的组件中进行了测量),那么您可能存在内存泄漏。我首先注意到其他人报告组件使用千兆字节内存的问题(通常使用大约 2-3MB)。如果您想查看进程内存的长期视图,Perfmon 很有用。您可以按名称选择进程,然后选择私有字节度量,并设置时间和网格以测量(比如说)24 小时。

一旦您确定进程内存明显增加,您可以使用调试器、Valgrind、Parasoft、Glow Code 等工具来确保您看到的是真正的内存泄漏。但是,即使它不是真正的内存泄漏(未引用的堆内存),如果您的内存使用量不断增加,您仍然需要重新设计您的组件。

于 2012-10-23T09:46:15.727 回答
0

为了确认您对泄漏部分的怀疑,您可以以 Perfmon 内存分析为例 -

Private Bytes 是可执行文件正在使用的内存量的合理近似值,可用于帮助缩小内存泄漏的潜在候选者列表;如果您看到这个数字不断增长且无休止地增长,您会想要检查该过程是否存在泄漏。但是,这不能证明存在或不存在泄漏。

有关详细信息,请参阅 -什么是私有字节、虚拟字节、工作集?

于 2012-10-23T10:19:58.843 回答
0

简短的回答:这是不可能的。

只看任务管理器,没有足够的可用数据。内存泄漏通常是仍然分配但不再使用的内存;然而,对于任务管理器来说,它看起来好像该进程仍然会使用该内存(并且它无法找出)。您可能会注意到内存使用量的持续增加,但这只是可能存在内存泄漏的一个指标 - 也可能是程序确实使用了该内存(或保留该内存以备将来使用,例如因为它使用自己的内存)内存管理)。如果不使用其他工具,您将无法知道。

于 2012-10-23T09:25:14.007 回答