[英]Measure static, heap and stack memory ? (c++, Linux - Centos 7)
我想分別測量堆棧,堆和靜態內存,因為我對每個內存都有一些限制。
為了測量堆內存,我使用valgrind-> massif工具。 Massif也應該可以測量堆和堆棧內存,但是它顯示出奇怪的結果:
沒有--stacks = yes的最后一個快照提供了total(B)= 0,有用堆(B)= 0,extra-heap(B)= 0(所以一切都很好)
使用--stacks = yes的最后一個快照提供了total(B)= 2,256,有用堆(B)= 1,040,extra-heap(B)= 0,stacks(B)= 1,208(即使它是相同的命令和相同的二進制文件經過測試...不知道為什么...)
所以最后我需要一個工具來測量C ++二進制文件使用的堆棧和靜態內存,歡迎您提供一些幫助:)
謝謝你的幫助 !
-----------編輯--------------
除了Basile Starynkevitch注釋之外,為了解釋靜態,堆棧和堆內存的含義,我從Dmalloc庫文檔中獲取了它:
靜態數據是其存儲空間已編譯到程序中的信息。
/* global variables are allocated as static data */ int numbers[10]; main() { … }
堆棧數據是在運行時分配的數據,用於保存函數內部使用的信息。 該數據由系統在稱為堆棧空間的空間中管理。
void foo() { /* if they are, the parameters of the function are stored in the stack */ /* this local variable is stored on the stack */ float total; … } main() { foo(); }
堆數據也在運行時分配,並為程序員提供了動態內存功能。
main() { /* the address is stored on the stack */ char * string; … /* * Allocate a string of 10 bytes on the heap. Store the * address in string which is on the stack. */ string = (char *)malloc(10); … /* de-allocate the heap memory now that we're done with it */ (void)free(string); … }
我想分別測量堆棧,堆和靜態內存,因為我對每個內存都有一些限制。
我無法想象為什么每個人都有單獨的約束。 他們都坐在虛擬內存中 ! 順便說一句,您可以使用setrlimit(2)來設置限制(也許來自調用shell進程,例如內置bash ulimit
)。
如果您考慮進程的實際虛擬地址空間 ,那么您的定義是幼稚的。
順便說一句, proc(5)使您可以查詢該空間,例如,從程序內部使用/proc/self/maps
(例如, /proc/1234/maps
可以從終端查詢pid 1234的進程)。 您還可以使用/proc/self/status
和/proc/self/statm
(順便說一句,在終端中嘗試cat /proc/self/maps
和cat /proc/$$/maps
)。 在Linux上,您還可以使用mallinfo(3)和malloc_stats(3)來獲取有關內存分配統計信息。
靜態數據可能在程序的數據段 (或BSS段)中。 但是線程本地空間呢? 這些數據段還包含各種庫內部的數據,特別是C標准庫libc.so
(這算嗎?)。 當然,堆棧段通常比實際使用的堆棧大(因為頁面對齊)(從“底部”到當前%esp
寄存器)。 多線程進程具有多個堆棧(和堆棧段),每個線程一個。
堆棧數據當然在調用堆棧中,其中包含許多其他內容(返回地址,間隙,溢出的寄存器),而不僅僅是自動變量 (其中一些僅位於寄存器中或由編譯器優化,而沒有占用任何堆棧插槽) )。 他們算嗎? 另外,來自crt0 (調用main
)的啟動代碼可能會占用一點堆棧空間(計數嗎?)...
堆分配的數據(可以從各種庫分配,甚至可以從動態鏈接器分配)不僅包含程序從malloc
(和好友)獲取的內容,還包含必要的開銷。 這算嗎? 那內存映射文件呢? 他們應該怎么算?
我建議查詢實際的虛擬地址空間(例如,通過讀取/proc/self/maps
或使用pmap(1) ...),但是它們會帶來與您要求的有所不同的東西。
順便說一句,我在你回答之前找到了它:
要測量堆內存,請使用valgrind-> massif
要測量靜態內存,請使用二進制文件上的bash函數size
要測量堆棧,可以使用堆棧
它提供了我想要的所有統計信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.