web-dev-qa-db-ja.com

メモリ使用量をプロファイルする方法は?

Valgrindは知っていますが、メモリ管理の問題を検出するだけです。私が探しているのは、プログラムのどの部分がどれだけのメモリを消費しているかの概要を示すツールです。たとえば、 (KCachegrindがCallgrindに対して行うように)ツリーマップは格好良いでしょう。

私はLinuxマシンで作業しているので、Windowsツールはあまり役に立ちません。

35
math

Valgrindツールの一部である massif を使用します。 massif-visualizer は、データをグラフ化するのに役立ちます。または、ms_printコマンド。

36
ismail

Googleが提供する heap profilergperftools で提供されています。私は常にソースからビルドしてきましたが、いくつかのLinuxディストリビューションでは プリコンパイル済みパッケージ として入手できます。

動的ライブラリを実行可能ファイルにリンクしてプログラムを実行するのと同じくらい簡単に使用できます。次のいずれかが発生するたびに、すべての動的メモリ割り当てに関する情報を収集し(私が確認した限り)、ディスクにメモリダンプを保存します。

  • _HEAP_PROFILE_ALLOCATION_INTERVAL_バイトはプログラムによって割り当てられています(デフォルト:1Gb)
  • ハイウォーターメモリ使用量マークが_HEAP_PROFILE_INUSE_INTERVAL_バイト増加します(デフォルト:100Mb)
  • _HEAP_PROFILE_TIME_INTERVAL_秒が経過しました(デフォルト:非アクティブ)
  • コードから明示的にHeapProfilerDump()を呼び出します

ヒープ使用量のスナップショットをいつ取得し、2つの異なるスナップショットを比較できるので、私の経験では最後のものが最も便利です何が悪いのか見てみましょう。

最終的に、テキストまたはグラフィック(有向グラフの形式)など、いくつかの可能な出力形式があります。

Graph of memory usage

このツールを使用して、Massifを使用して見つけることができなかった誤ったメモリ使用量を見つけることができました。

8
Paolo M

「新しい」オプションは HeapTrack です。 massifとは異なり、malloc/freeのインストルメントバージョンであり、すべての呼び出しを保存してログをダンプします。

GUIはナイスです(ただし、Qt5 IIRCが必要です)。結果のタイミング(時間も追跡したい場合があるため)は、valgrindよりも偏っていません(エミュレートされていないため)。

3