DevPartner メモリ分析機能について DevPartner Studio ( 以降 DPS と記す ) のメモリ分析機能は Visual Studio 2005 2008 2010 2012 の VB.NET や C# などのマネージ言語で作成したシステムのメモリ使用状態を分析する機能です このドキュメントは メモリ分析 の代表的な使用方法を簡単に説明するものです ) 当資料は DPS11.1( 日本語版 ) 用に作成されております その他のバージョンでは画面構成や使用できる機能 対応言語に違いがある場合がございます メモリ分析機能の詳細に関しては DevPartner のヘルプを参照下さい d
目次 1 メモリ分析の機能概要... 3 2 メモリ分析の設定... 4 3 メモリ分析の起動... 5 3.1 RAMフットプリント機能... 6 3.2 一時オブジェクト分析... 7 3.2.1 一時オブジェクトの分析... 7 3.2.2 一時オブジェクトの詳細分析... 8 3.3 メモリリーク分析... 9 3.3.1 メモリリーク分析の開始... 9 3.3.2 ガベージコレクションの実行... 10 3.3.3 メモリリーク分析のスナップショット... 10 3.3.4 メモリリーク分析結果の表示...11 3.3.5 メモリリークの詳細分析...11 4 メモリ使用量分析 (RAM フットプリント ) の具体例... 12 4.1 対象プログラムの実行... 12 4.2 メモリ分析画面の確認... 12 4.3 スナップショットによるメモリ使用量の分析 ( オブジェクト単位 )... 13 4.3.1 スナップショット結果画面 ( オブジェクト単位 )... 13 4.3.2 メモリ分析の結果詳細画面 ( オブジェクト単位 )... 14 4.4 スナップショットによるメモリ使用量の分析 ( メソッド単位 )... 17 4.4.1 スナップショット結果画面 ( メソッド単位 )... 17 4.4.2 メモリ分析の結果詳細画面 ( メソッド単位 )... 18 2
1 メモリ分析の機能概要 DevPartner Studio のメモリ分析には 以下の 3 種類の機能があります 各機能の使用方法に 関しては 次ページ以降の説明を参照下さい 表 1-1 メモリ分析の機能 機能 説明 1. RAMフットプリント メモリの使用状況をリアルタイムに分析 2. 一時オブジェクト分析 一時オブジェクトを分析し メソッド単位 ソースコード単位にバイト数を表示 3. メモリリーク分析 ( オブジェクトリーク分析 ) 参照が残っているオブジェクトを分析し メソッド単位 ソースコード単位にバイト数を表示 ) メモリリーク分析は アプリケーション内の残存しているオブジェクトに関するメモリ情 報を表示するものです メモリリークの可能性があるものを指摘いたしますので 実際にメモリ リークかどうかはオブジェクトの生成や開放のロジックと合わせて御判断下さい 3
2 メモリ分析の設定 メモリ分析 機能を実行する前に メモリ分析対象を確認します Visual Studio において プロジェクトのプロパティ システムオブジェクトの追跡 は 標準設定では True になっています 使用しているマシンのメモリが少ない場合や メモリ分析 機能を実行するとパフォーマンスが悪くなる場合などには この値を False にします 図 2-1 メモリ分析のプロパティ設定 4
3 メモリ分析の起動 メモリ分析 機能で解析しながら対象プログラムを実行することで メモリの使用状況を数値化して画面に表示します Visual Studio で分析対象のソリューションを開き メニューから DevPartner デバッグを実行せずにメモリ分析を選択して開始 をクリックし実行します 図 3-1 メモリ分析の起動 メモリ分析モードで起動すると 以下のようなメモリ分析画面が表示されます 画面上部には メモリ使用量のグラフ 画面下部にはクラス毎のメモリ使用量が表示されます この画面情報はリアルタイムに更新されていきます クラス毎のメモリ使用量 メモリ使用量グラフ 図 3-2 実行中のメモリ分析 5
3.1 RAM フットプリント機能 メモリ分析の画面から RAMフットプリントを表示 機能をクリックすることで その瞬間のメモリ使用状況を確認 保存することが出来ます RAM フットプリントを表示 図 3-3 RAM フットプリントの実行 図 3-4 RAM フットプリントのスナップショット 6
3.2 一時オブジェクト分析メモリ分析の画面から 一時オブジェクト タブを選択すると 一時オブジェクト分析用の画面になります この画面で 一時オブジェクトを表示 メニューをクリックします [ 一時オブジェクト ] タブ 一時オブジェクトを表示 図 3-5 一時オブジェクトタブ 3.2.1 一時オブジェクトの分析上部にはエントリポイント単位 下部にはメソッド単位で 一時オブジェクトのメモリ使用量が多いものを上位 5つ表示します それぞれにある すべての情報を表示 ボタンを押下することで詳細情報を表示します 図 3-6 一時オブジェクトメモリ量の上位 5 表示 7
3.2.2 一時オブジェクトの詳細分析一時オブジェクトのサイズ ( バイト数 ) をメソッド単位 ソースコード単位で表示します メモリサイズによるコールグラフも表示されますので一時オブジェクトを大量に発生させている箇所を見つけるのに役立ちます 図 3-7 一時オブジェクトの詳細表示 8
3.3 メモリリーク分析 メモリ分析の画面から メモリリーク タブを選択すると メモリリーク分析用の画面になります 図 3-8 メモリリークタブ 3.3.1 メモリリーク分析の開始メモリリーク分析画面で メモリ割り当ての追跡の開始 を実行します グラフ上に 追跡オン と表示され メモリリーク分析が開始されます メモリ割り当ての追跡開始 メモリ割り当ての追跡が開始された状態 図 3-9 メモリリーク分析の開始 データ収集の対象であるアプリケーションの機能を一度最後まで実行します ただし アプリケーションは終了しないでください 9
3.3.2 ガベージコレクションの実行 ガベージコレクションの実行 をクリックして アクティブなプロセスに対してガ ベージコレクションを実行します ガベージコレクションの実行 図 3-10 ガベージコレクションの実行 3.3.3 メモリリーク分析のスナップショット 追跡オン を実行した後 図 3-10の メモリリークの表示 ボタンを押下すると 追跡を開始してから メモリリークの表示 ボタン押下までの間のメモリリーク分析結果を画面に表示します ( 図 3-11) ) この 追跡開始 から メモリリークの表示 までの間に メモリリークを解析したいプログラム機能を実際に実行します メモリリークを表示 図 3-111 メモリリーク分析の開始 10
3.3.4 メモリリーク分析結果の表示上部にはオブジェクト単位 下部にはメソッド単位で メモリリークと思われるメモリが多いものを上位 5つ表示します それぞれにある すべての情報を表示 ボタンを押下することで詳細情報を表示します 図 3-122 メモリリーク分析結果の表示 3.3.5 メモリリークの詳細分析メモリリークと思われるメモリのサイズ ( バイト数 ) をメソッド単位 ソースコード単位で表示します メモリサイズによるコールグラフも表示されますのでメモリリークが発生していると思われる箇所を見つけるのに役立ちます 図 3-133 メモリリーク情報の詳細表示 11
4 メモリ使用量分析 (RAM フットプリント ) の具体例作成したプログラムがメモリを大量に使用してしまう場合 プログラムを実際に動作させ RAM フットプリント機能によってメモリ消費量を数値によって確認します 4.1 対象プログラムの実行分析したいプロジェクト ( ソリューション ) を Visual Studio で開き メニューから DevPartner - デバッグを実行せずにメモリ分析を選択して開始 を実行します 図 4-1 メモリ分析の起動 4.2 メモリ分析画面の確認分析中のプログラムが どれくらいメモリを使用しているかリアルタイムに監視します メモリ使用量グラフが高くなるタイミングや インスタンス数 や バイト数 が高いオブジェクトに注目します 図 4-2 メモリ分析画面の確認 12
4.3 スナップショットによるメモリ使用量の分析 ( オブジェクト単位 ) メモリの詳細情報を見たいタイミングで RAM フットプリントボタンを押すことでスナ ップショット画面が表示されます RAM フットプリントを表示 図 4-3 RAM フットプリントの実行 4.3.1 スナップショット結果画面 ( オブジェクト単位 ) スナップショット画面において オブジェクト単位でメモリ使用量を追いかけたい場合は 上部の棒グラフを参照します メモリを多く使用して上位 5つのオブジェクトが表示されます 詳細表示ボタンで より細かい情報を表示することが出来ます オブジェクト単位のメモリ使用量 詳細表示ボタン 図 4-4 RAM フットプリントのスナップショット 13
4.3.2 メモリ分析の結果詳細画面 ( オブジェクト単位 ) オブジェクト毎に 参照バイト数 参照オブジェクト数 が表示されます このケースでは MemoryAnalysis という名前のオブジェクトが内部に 107 個のオブジェクトへの参照を持ち 207,248 バイトを使用していることがわかります オブジェクト名 参照バイト数 参照オブジェクト数 図 4-5 メモリ分析結果 ( オブジェクト単位 ) オブジェクト MemoryAnalysis を詳細に分析するために 当該オブジェクトを選択した状態で マウスの右ボタンでメニューから このオブジェクトによって参照されているライブオブジェクトを表示 を実行します 参照オブジェクト情報表示メニュ 図 4-6 参照オブジェクト詳細表示 14
分析対象のオブジェクトが内部で参照しているオブジェクトの 上位 200 がリスト表示されます この場合 オブジェクト MemoryAnalysis の中で MyCollection という名前のオブジェクトが最も多い 206,628 バイトを使用していることがわかります 図 4-7 参照オブジェクト詳細表示実行 問題と思われる参照オブジェクトを ソースコードレベルで確認します 対象オブジェクトを選択し マウス右ボタンメニューから ソースを表示 を実行します ソースコードを表示 図 4-8 ソースコード表示メニュー 15
画面下部に表示されるソースコード行単位でのメモリ使用量をチェックします メモリを多く使用している箇所が見当たらない場合は 更に このオブジェクトによって参照されているライブオブジェクトを表示 メニューを使って 下位オブジェクトを分析します 当該のソースコードと行単位のメモリ使用量 図 4-9 ソースコード表示メニュー 同様の手順を繰り返すことで 問題の行を特定します このサンプルの場合では String" オブジェクト中の行で 4,112 バイトのメモリが消費されていることが特定されています 問題と思われるソースコード行 図 4-10 ソースコード表示メニュー 16
4.4 スナップショットによるメモリ使用量の分析 ( メソッド単位 ) メモリの詳細情報を見たいタイミングで RAM フットプリントボタンを押すことでス ナップショット画面が表示されます RAM フットプリントを表示 図 4-11 RAM フットプリントの実行 4.4.1 スナップショット結果画面 ( メソッド単位 ) スナップショット画面において メソッド単位でメモリ使用量を追いかけたい場合は 下部の棒グラフを参照します メモリを多く使用して上位 5つのメソッドが表示されます 詳細表示ボタンで より細かい情報を表示することが出来ます メソッド単位のメモリ使用量 詳細表示ボタン 図 4-12 RAM フットプリントのスナップショット 17
4.4.2 メモリ分析の結果詳細画面 ( メソッド単位 ) メソッド毎に 使用メモリバイト数 使用メモリ量 / 比率 が表示されます ライブサイズ / 下位も含む (%) の項目をクリックして メモリ使用率( 下位のメソッドを含む ) で降順に表示します メソッド名 参照バイト数 下位メソッドを含むメモリ使用比率 図 4-13 メモリ分析結果 ( メソッド単位 ) メソッドリストの一番上に表示されるのが 最もメモリを使用しているメソッドです マウスで選択すると 画面下部にメモリコールグラフが表示されます 最もメモリを使用しているメソッド メモリコールグラフ 図 4-14 メモリコールグラフ 18
ボトルネックと思われるメソッドにたどり着いたら コールツリー上のメソッドを選択し マウス右ボタンメニューから ソースを表示 を実行します ソースコードを表示 図 4-155 メソッド選択後の ソースを表示 メニュー ソースコード行単位で使用メモリ量が表示されます 問題と思われるソースコード行 図 4-166 ソースコード単位のメモリ使用量 19