簡體   English   中英

了解GCC的`-fmem-report`輸出

[英]Understanding GCC's output of `-fmem-report`

我應該如何解釋GCC的-fmem-report標志給出的輸出?

我可以從表格和后續統計信息中檢索哪些信息?

我已經嘗試在編譯期間檢索峰值內存消耗並直觀地思考,表格的最后一行( Total )給出了值。 但這些遠非我在top看到的那些。
在編譯我的項目時, gcc進程的最高峰值約為1.7GB,但我在構建日志中找到的最大值大約為750MB。

還有哪些其他GCC標志可以幫助我監控這些~1.7GB? 或者我是否需要將make包裝在監視gccld進程的腳本中?

鑒於以下輸出,哪些值是最重要和最有用的?

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命令,尤其是dvml l limit。 記住也要使用-S (軟限制)開關,否則你必須關閉終端/控制台/ konsole以重新獲得無限制的限制。 (聽起來像營銷計划)

fmem-report在gcc源代碼的common.opt文件中定義。 您可以使用ctags和cscope來獲取設置fmem-report標志的實際文件,然后您需要查看檢查此標志的代碼。 如果你沒有得到這個讓我知道我會找到它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM