2009-10-14 85 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>

輸出上市對於