我正在编写一个应用程序,我很惊讶它的总内存使用量已经太高了。我想分析我的应用程序的动态内存使用情况:堆中有多少个对象,以及哪些函数创建了这些对象?此外,每个对象使用了多少内存?
有一种简单的方法吗?我正在研究linux和windows,所以任何平台的工具都足够了。
注意:我不关心内存泄漏。
答案 0 :(得分:14)
你试过Valgrind吗?它是Linux的分析工具。它有一个名为Memcheck的内存检查器(用于内存泄漏和其他内存问题),但它还有一个名为Massif的堆分析器。
答案 1 :(得分:9)
对于简单的统计,只是为了找出所有内存的使用位置,你可以添加这样的模板:
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();
...
}
这并没有显示分配对象的功能,也没有给出太多细节,但是我可以找到浪费内存的位置。
答案 2 :(得分:8)
对于Windows,请检查“crtdbg.h”中的函数。 crtdbg.h包含内存分配函数的调试版本。它还包含检测内存泄漏,损坏,检查堆指针有效性等功能。
我认为以下功能对您有用。
_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince
以下MSDN链接列出了堆状态报告功能和示例代码 http://msdn.microsoft.com/en-us/library/wc28wkas(VS.80).aspx
答案 3 :(得分:5)
您可以尝试http://www.softwareverify.com/cpp/memory/index.html
中的Memory Validator这是我用于分析内存使用情况的最佳工具之一。 30天评估版可以免费下载。
答案 4 :(得分:3)
你可以做几件事。最简单的方法是链接调试malloc库;根据环境的详细信息,可以使用其中的一些(例如,google for _malloc_dbg for Windows。)
第二个选择是你可以在C ++中重载 new 和 delete ;可以使用跟踪内存分配和使用的新函数来重载基本的new和delete。
答案 5 :(得分:3)
MTuner - 一个免费的C / C ++内存分析器。说明如下:
MTuner是一个支持MSVC,GCC和Clang编译器的多平台内存分析,泄漏检测和分析工具。功能包括:基于时间轴的内存活动历史,强大的过滤功能,带完整源代码的手动检测SDK,通过命令行使用的持续集成支持,内存泄漏检测等等。使用GCC或Clang交叉编译器配置任何软件目标平台。内置支持Windows,PlayStation 4和PlayStation 3平台以及基于Windows的交叉编译器的平台。
答案 6 :(得分:2)
我刚刚发布了一个win32原生内存分析器MemPro,作为免费测试版。 http://www.puredevsoftware.com/MemPro.htm。它挂钩到新/删除并将数据发送到外部应用程序,您可以在其中以各种不同的方式查看分配。希望这有帮助。
答案 7 :(得分:1)
在之前的工作中,我们使用了一种名为“Purify”的工具。它是Rational / IBM生产的产品。我不认为这是一个免费的工具,但我记得它很不错。以下是一些信息:
答案 8 :(得分:1)
来自Game Programming Gems Volume 2(Amazon link)的第1.10章详细介绍了Peter Dalton提供的一个简单但有效的Drop-in Debug Memory Manager,它在您转储日志时提供了一组不错的统计信息。
答案 9 :(得分:1)
第3章4.6从Game Programming Gems Volume 8(Safari Book预览链接)详细介绍了Ricky Lung的高级内存分析器,它可以以分层调用堆栈方式显示分配统计信息,但支持多线程。
答案 10 :(得分:0)
刚刚看到AQtime site他们对“分配概要分析”有很好的支持。
答案 11 :(得分:0)
尝试gperftools - 它可以:
此外,它几乎不会影响程序效率。