C ++中的内存分配分析
我正在编写一个应用程序,并且很惊讶地发现它的内存使用总量已经太高了。 我想剖析我的应用程序的dynamic内存使用情况:堆中有多less种对象,以及哪些函数创build了这些对象? 另外,每个对象使用多less内存?
有一个简单的方法来做到这一点? 我正在linux和windows上工作,所以任何平台的工具就足够了。
注意:我不关心这里的内存泄漏。
你尝试过Valgrind吗? 这是一个用于Linux的分析工具。 它有一个内存检查器(用于内存泄漏和其他内存问题),称为Memcheck,但它也有一个名为Massif的堆分析器。
对于Windows检查“crtdbg.h”中的function。 crtdbg.h包含内存分配函数的debugging版本。 它还包含检测内存泄漏,损坏,检查堆指针的有效性等function。
我认为以下function对你有用。
_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince
以下MSDN链接列出堆状态报告function和示例代码http://msdn.microsoft.com/en-us/library/wc28wkas(VS.80).aspx
对于简单的统计,只要找出所有的内存使用,你可以添加一个这样的模板:
template<class T> class Stats { static int instance_count; public: Stats() { instance_count++; } ~Stats() { instance_count--; } static void print() { std::cout << instance_count << " instances of " << typeid(T).name() << ", " << sizeof(T) << " bytes each." << std::endl; } }; template<class T> int Stats<T>::instance_count = 0;
然后,您可以将其作为基类添加到您怀疑拥有大量实例的类中,并打印出当前内存使用情况的统计信息:
class A : Stats<A> { }; void print_stats() { Stats<A>::print(); Stats<B>::print(); ... }
这并没有告诉你在哪些函数中分配了对象,也没有给出太多的细节,但是我可以find内存被浪费的地方。
您可以从http://www.softwareverify.com/cpp/memory/index.html尝试Memory Validator
这是我分析内存使用情况时遇到的最好的工具之一。 30天评估版可免费下载。
有几件事你可以做。 最简单的事情是链接一个debuggingmalloc库; 有一些可用的,取决于你的环境的细节(例如,谷歌的_malloc_dbg为Windows。)
第二个select是你可以在C ++中重载新的和删除 ; 可以使用跟踪内存分配和使用情况的新function来重载基本的new和delete。
MTuner – 一个免费的C / C ++内存分析器。 下面介绍:
MTuner是一款支持MSVC,GCC和Clang编译器的多平台内存分析,泄漏检测和分析工具。 其特点包括:基于时间线的内存活动历史logging,强大的过滤function,完整源代码的手动testingSDK,通过命令行使用的持续集成支持,内存泄漏检测等等。 用GCC或Clang交叉编译器剖析任何软件定位平台。 内置支持Windows,PlayStation 4和PlayStation 3平台,以及基于Windows交叉编译器的平台。
我刚刚发布了一个win32本机内存分析器MemPro,作为一个免费的testing版。 http://www.puredevsoftware.com/MemPro.htm 。 它挂钩到新build/删除,并将数据发送到外部应用程序,您可以通过各种不同的方式查看分配。 希望这是帮助。
在之前的工作中,我们使用了一个名为“净化”的工具。 这是Rational / IBM制作的产品。 我不认为这是一个免费的工具,但我记得它是相当不错的。 这里有一些信息:
从游戏编程的第1.10章gem第二卷 ( 亚马逊链接 )详细介绍了一个简单而有效的embedded式debugging内存pipe理器,由Peter Dalton在转储日志时提供了一套体面的统计信息。
游戏编程Gems第8卷 (Safari书籍预览链接)第4.6章详细介绍了Ricky Lung提供的高级内存分析器,它可以以分层调用堆栈的方式显示分配统计信息,但支持multithreading。
刚刚在AQtime网站上看到他们对“分配分析”有很好的支持。
尝试Gperftools – 它可以:
- configuration文件的特定部分或整个程序一次。
- 通过直观的graphics表示数据,显示确切的函数调用及其inheritance。
- 专注于视觉graphics中特定的代码区域。
- 显示转储之间的差异。
- 显示分配的空间,而不是使用 – 所有这些都是使用相同的转储。
而且,它几乎不影响程序的效率。