2009-10-14 86 views
0

如何在Linux中获得每个线程的进程内存消耗?我知道我们可以使用/ proc/pid/task/tid/statm,但那不能帮助我的情况。 所有线程都显示相同的值并且与PID的统计量相同。进程的线程级内存消耗

我们可以做valgrind,但我不寻找任何无效的读/写或泄漏。 Valgrind不会告诉我任何线程级别的信息。

其他建议?

编辑: 如何分析我的代码?多少内存分配在哪个函数/行号等?

+1

嘛TID匹配,概念,所有的线程可以访问相同的内存池,所以他们都使用相同的金额。你想跟踪的是每个线程的分配数量 - 我不认为glibc或内核会这样做。并考虑:你如何计算在一个线程中分配的内存块,并在另一个线程中释放? – 2009-10-14 17:03:06

+0

我可以在malloc上面编写包装器,它可以收集统计信息,但如果我用大量的malloc分析庞大的代码,它会很困难。 – Jack 2009-10-14 17:12:02

+0

如何使用调用'gettid(2)'的malloc的包装?这样,您可以保持调用代码相同,同时跟踪哪个线程正在调用封装。 – 2009-10-14 17:39:24

回答

2

所有线程共享相同的地址空间并使用相同的堆,因此除了它们的堆栈之外,它们都应显示相同的内存使用情况。

+0

感谢您的回答。现在让我重新修改我的问题: 如何在线程级别配置我的二进制文件?我的意思是,在代码的哪个点分配了多少内存? 我的线程通常不共享内存块。他们只是分享一些fds,IPC文件等 – Jack 2009-10-14 17:06:51

+0

接受这个,因为这是我得到的唯一答案:D 我同意它显示相同的内存使用情况的事实。除此之外,做不了什么。 – Jack 2010-03-19 16:23:14

0

Linux中有一个选项可以查看CPU和内存的线程级使用

可以使用命令top与选项-H-p

top -H -p<PID> 

命令将列出结果与下面的头和在这种情况下,您应该读取PID作为TID(线程ID)。

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND` 

在java进程的情况下,它是非常明显的如下。如果你创建一个进程的线程转储和转换线程ID为十进制你可以在top -H -p <PID>

输出上市对于