【发布时间】:2011-07-31 08:02:21
【问题描述】:
我正在维护一个程序,启动时使用600+MB内存,什么都不做!
我想知道每个线程使用了多少内存,gdb 可以做这个工作吗?
【问题讨论】:
-
第一个问题是:你怎么知道它在使用600MB?你可能看错了。
-
线程共享全局堆空间。线程的唯一本地数据是它的堆栈和线程局部变量。
标签: c++ linux multithreading memory gdb
我正在维护一个程序,启动时使用600+MB内存,什么都不做!
我想知道每个线程使用了多少内存,gdb 可以做这个工作吗?
【问题讨论】:
标签: c++ linux multithreading memory gdb
我认为您可能需要像 IBM/Rational Purify 或 valgrind 这样的内存分析工具。
另外,如果您的程序在启动时使用 600Mb,您应该首先检查您的依赖库在加载后在做什么。你可能还没有输入main(),但他们可能正在创建一些重量级的全局静态对象,这些对象甚至在事情开始之前就被初始化了。
要记住的另一件事是,每个线程都会为其堆栈分配大量内存。每个线程可能是 1 MB 或更多,所以如果您自己创建 600 个线程,那么已经有 600Mb 消失了。
【讨论】:
valgrind --tool=massif 是正确的解决方案。它将为您提供所有信息,哪个线程在什么时间点使用了多少内存。
【讨论】: