[英]Understanding GCC's output of `-fmem-report`
我應該如何解釋GCC的-fmem-report
標志給出的輸出?
我可以從表格和后續統計信息中檢索哪些信息?
我已經嘗試在編譯期間檢索峰值內存消耗並直觀地思考,表格的最后一行( Total
)給出了值。 但這些遠非我在top
看到的那些。
在編譯我的項目時, gcc
進程的最高峰值約為1.7GB,但我在構建日志中找到的最大值大約為750MB。
還有哪些其他GCC標志可以幫助我監控這些~1.7GB? 或者我是否需要將make
包裝在監視gcc
和ld
進程的腳本中?
鑒於以下輸出,哪些值是最重要和最有用的?
Memory still allocated at the end of the compilation process
Size Allocated Used Overhead
8 40k 38k 1200
16 104k 100k 2288
32 296k 295k 5328
64 20k 16k 320
128 4096 384 56
256 48k 45k 672
512 188k 187k 2632
1024 888k 887k 12k
2048 156k 154k 2184
4096 188k 188k 2632
8192 56k 48k 392
16384 16k 16k 56
32768 32k 0 56
65536 64k 0 56
131072 128k 128k 56
24 236k 232k 4248
40 36k 33k 576
48 12k 8496 192
56 4096 2016 64
72 12k 8136 168
80 4096 480 56
88 1448k 1429k 19k
96 12k 10k 168
112 4096 1568 56
120 8192 5040 112
184 16k 14k 224
160 4096 960 56
168 36k 35k 504
152 56k 51k 784
104 4096 416 56
352 516k 486k 7224
136 4096 408 56
Total 4640k 4424k 63k
String pool
entries 16631
identifiers 16631 (100.00%)
slots 32768
deleted 0
bytes 252k (17592186044415M overhead)
table size 256k
coll/search 0.4904
ins/search 0.0345
avg. entry 15.55 bytes (+/- 9.75)
longest entry 66
??? tree nodes created
(No per-node statistics)
Type hash: size 1021, 27 elements, 0.140351 collisions
DECL_DEBUG_EXPR hash: size 1021, 0 elements, 0.000000 collisions
DECL_VALUE_EXPR hash: size 1021, 0 elements, 0.000000 collisions
no search statistics
decl_specializations: size 61, 0 elements, 0.000000 collisions
type_specializations: size 61, 0 elements, 0.000000 collisions
No gimple statistics
Alias oracle query stats:
refs_may_alias_p: 0 disambiguations, 0 queries
ref_maybe_used_by_call_p: 0 disambiguations, 0 queries
call_may_clobber_ref_p: 0 disambiguations, 0 queries
PTA query stats:
pt_solution_includes: 0 disambiguations, 0 queries
pt_solutions_intersect: 0 disambiguations, 0 queries
輸出顯示編譯期間使用的內存。 GCC / G ++根據需要以各種大小的塊分配內存。
拿第一個條目,例如:
Size Allocated Used Overhead
8 40k 38k 1200
這表明40K的內存分配在8字節的塊中,其中40K,38K由編譯器使用,1200字節是'會計開銷'。 Malloc(3)並不總是完全按照你的要求返回,通常有一小部分字節表示這個塊有多大,各種會計數據(誰擁有這個塊),如果事情需要對齊,可能會有未使用的字節。
基本上,這些信息只是會計記錄。
接近結尾的哈希表顯示井哈希例程如何工作,允許GCC / G ++在其表中查找事物,發生了多少沖突(相同的哈希值),需要處理,等等。
我喜歡'String Pool'中的'bytes'條目:
bytes 252k (17592186044415M overhead)
存儲字符串需要多少內存? 我的天啊!! 這就是MEGABytes。 {Grin}可能是一個bug。 可能不是......你有多少公羊?
總的來說,GCC / G ++在你的編譯過程中使用了1.7GB因為這是可用的,考慮一下,你是否使用多個/並行編譯? (-j switch),這會增加用法,因為並行程序不會相互通信。 使用512M可用RAM進行編譯只需要更長的時間,因為GCC / G ++必須更頻繁地停止和清理以保持足夠的RAM可用。
如果你想看看它在較小的內存約束下如何反應,請查看ulimit命令,尤其是d , v , m和l l limit。 記住也要使用-S (軟限制)開關,否則你必須關閉終端/控制台/ konsole以重新獲得無限制的限制。 (聽起來像營銷計划)
fmem-report在gcc源代碼的common.opt文件中定義。 您可以使用ctags和cscope來獲取設置fmem-report標志的實際文件,然后您需要查看檢查此標志的代碼。 如果你沒有得到這個讓我知道我會找到它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.