2011-10-19 56 views
3

我知道在內存分析中已經有一些線程使用了massif和其他工具,但我不知道是否有任何工具或常見技術用於生產環境中的運行時內存分析。C++中的運行時內存分析

可以想象一個實現,其中每個類都提供一個memSize()函數,並通過在其所有成員上調用memSize()並添加它們自己的大小(或大小估計)來擴展容器。然後,在任何時候,您都可以查詢應用程序,並使用大部分內存以及隨着時間的推移而改變的主要數據結構。

不幸的是,上述策略可能會非常棘手 - 您必須處理諸如鎖定,內存對齊等問題,有時您不會知道第三方數據結構有多大,並且您必須猜測。總的來說,它似乎還有相當多的工作要添加到所有類...

因此,來實際的問題 - 什麼是監視內存使用情況和導致內存在運行時增長的好方法處理?

回答

2

如果你願意:

  • 實現自己的內存管理;或
  • 創建周圍的內存分配/ dealloc的函數的包裝使用的是

,那麼你可以跟蹤什麼分配,大小和業主。在我們的嵌入式設備中,我們擴展了內存管理器,爲分配的每個內存塊記錄附加信息。在我們的例子中,我們跟蹤以下內容:

  • 時間戳
  • 線程ID
  • 塊大小
  • 堆在分配

的時間歷程,我們有一個機制,通過它我們可以要求系統遍歷阻止列表(鏈接列表)並將上面的每個塊的信息轉儲到.csv文件。這可以在系統內存不足或內存崩潰時自動觸發,也可以隨時手動觸發。生成.csv文件後,我們有一個Perl腳本可以對其進行摘要並根據原始線程,堆棧跟蹤等對請求進行分組。這非常方便,例如,它可以讓我們看到有多少內存和多少分配來自代碼中的特定位置。

我們發現在查找泄漏方面非常有用的技術是在某個進程正在運行時的不同時間生成兩個或多個.csv報告。比較消化的記憶日誌可以讓我們輕鬆地發現泄露的記憶。

我們發現添加這些信息的開銷很大,因此我們在生產系統中啓用了此功能,以便當某個單元在該字段中失敗時,我們可以收集.csv文件並執行post-死亡分析。

+0

這看起來像很多額外的信息(特別是堆棧跟蹤),打開它的性能影響是什麼? –

+0

這基本上是massif類型方法的運行時版本,對吧?問題在於 - 比方說,如果你知道你有100M的字符串,並且這是你的大部分內存使用情況 - 這是否對你有幫助?假設你有大量的類和集合,其中包含字符串 - 你怎麼知道哪一個導致高使用率......這就是爲什麼我在考慮更多遍歷顯式結構類型的方法 – naumcho

+0

@Matthieu:在我們的嵌入式系統中獲取堆棧跟蹤並不昂貴。我們沒有得到符號,只是幀的地址,並且使它成爲固定成本,我們只提取前6幀左右。然後作爲後處理,我們使用符號圖將地址轉換爲符號。 – Miguel