2016-01-11 59 views
1

我正在嘗試減少C++應用程序的內存佔用量。隨着時間的推移,由於開發人員爲了各種目的在存儲器中創建新的重複數據表示,此應用程序對內存的使用量不斷增長。如何在內存分析期間跟蹤C++應用程序中內存訪問的頻率和數量?

我想確定訪問這些重複表示的數據的頻率,以便我可以決定是否使它們短暫存取以及創建訪問權限以減少峯值堆大小。

所以我的問題是 - 什麼是最好的方法來跟蹤,不僅大小和內存分配,的體積也是頻率和訪問量堆內存?我知道所有基本的內存配置文件處理分配信息 - 與內存訪問相關的是我感興趣的內容。

理想的答案是獨立於平臺,因爲此應用程序在Windows,Linux,iOS和Android上運行。但是,我會接受適用於這些平臺以及這些平臺通常使用的任何處理器架構的答案,因爲我們沒有特定於平臺的行爲會影響這類事情。

+0

IIRC valgrind支持這一點。 –

+0

寫下它作爲一個答案與一些指令,以便如何獲得這些信息,我會愉快地upvote和/或接受。 –

+0

對不起,但我更加認同:_「要求我們推薦或找到書籍,工具,軟件庫,教程或其他非本地資源的問題與Stack Overflow無關,因爲它們傾向於吸引自以爲是的答案並且垃圾郵件,而是描述問題以及到目前爲止解決問題所做的工作。「_ –

回答

3

就像它被評論,你的問題是非常廣泛的。

我無法以特定的方式回答它,但我會假設您可以訪問源代碼,可以使用gcc編譯它,並且您的plateform支持Valgrind。如果我的假設是錯誤的,請更新您的問題,因爲以下是關於Valgrind地塊的粗略教程,而這不是要求提供的內容。

  1. Install Valgrind
  2. 使用-g編譯程序和-O0
  3. 一旦執行完畢運行與
  4. 程序,該地塊工具將創建了一個名爲massif.out文件。[ PID]
  5. 運行命令ms_print massif.out.[PID]

這將產生表示的曲線圖內存消耗以及程序中所有分配點的詳細信息,包括峯值內存分配點。

如果你想跟蹤訪問內存,你可以使用DHAT工具(見this link的詳細說明):

  1. 與地塊,使用-g和-O0
  2. 編譯程序與valgrind --tool=exp-dhat your.exe
+0

這個答案中缺少的一點是跟蹤_accesses_到內存。我試圖確定數據的重複表示的頻率是多少,以便我可以決定是否使它們短暫存在,並創建訪問權限以減少峯值堆大小。 –

+0

我從來沒有使用它,但Valgrind的DHAT工具可以做到這一點。 [鏈接](http://valgrind.org/docs/manual/dh-manual.html) –

+0

如果你想添加DHAT的說明這個答案(或者甚至只是提及它),我會接受它。 DHAT看起來可能會給我以後的樣子。 –

1

兩個點運行程序:

1)如果你正在尋找內存泄漏(這可能會很慢)的這樣做的方法是使用其中一種方法來查看在程序結束時哪些內存塊還沒有被釋放。這可以讓你找出他們來自哪裏,以及他們爲什麼沒有被釋放。2)如果這是一個內存分配過度(和釋放)的問題,我發現它伴隨着很大一部分時間花費在做這些。所以這不僅僅是一個內存問題,它是一個性能問題,而且很容易找到。 Here's an example.

請注意,這與您提出的問題有點不同。 你問過如何跟蹤內存分配,以便找到可以消除的內存分配。 這項技術的作用是直接找到它們,而不需要通過跟蹤部分。 工作方式是內存分配和釋放在計算上花費很大,所以它往往佔了很大一部分週期,所以隨機時間的樣本很容易暴露它。

相關問題