troushoo

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

Visual Studio 2013 の新機能 : .NET アプリのダンプでメモリ解析

Visual Studio 2013 の新機能 : .NET アプリのダンプでメモリ解析

概要・まとめ

Visual Studio 2013 の新機能、「.NET アプリのダンプでメモリ解析」を紹介します。
本機能は、本番環境のメモリリークのトラブルシューティング時に使える機能です。

前提条件
以下の前提条件が必要になります。
・Visual Studio のエディションは、Ultimate
・.NET のバージョンは、.NET 4.5 以降

内容
以下、「本番環境でメモリリークの調査を行う」というシナリオで記述していきます。
以下のパートに分けて、紹介してきます。
1. メモリリークの検出方法
2. ダンプの取得方法
3. Visual Studio 2013 Ultimate を使用した、.NET アプリのダンプのメモリ解析
 3.1. メモリ使用状況の把握
 3.2. メモリリークの特定

1. メモリリークの検出方法
メモリリークを検出するには「パフォーマンス モニター」が便利です。
パフォーマンス モニターはWindows にデフォルトで入っているので、本番環境でも容易に使用可能です。

1.1. 「パフォーマンス モニター」を起動します。

1.2. “.NET CLR Memory” の “# Bytes in all Heaps” カウンターを追加します。


1.3. メモリーリークの発生を確認します。
メモリーリークが発生していると、以下の図のように右肩上がりのグラフになります。
グラフが右肩上がり

2. ダンプの取得方法
ダンプを取得する方法はいろいろありますが、ここではタスクマネージャー を使用してみます。
タスクマネージャーはWindows にデフォルトで入っているので、本番環境でも容易に使用可能です。

2.1. タスクマネージャーを起動します。

2.2. メモリリークが発生しているアプリを右クリックし、”ダンプ ファイルの作成” をクリックします。
ダンプ ファイルの作成

2.3. ダンプが作成されます。
ダンプが作成される

(注意) 64bit OSで、32 ビットの.NET アプリのダンプを取得するには、”C:\Windows\SysWOW64\Taskmgr.exe” を使用する必要があります。
64bit OSで、32 ビットの.NET アプリのダンプ取得時の注意点

3. Visual Studio 2013 Ultimate を使用した、.NET アプリのダンプのメモリ解析
上記2. で取得したダンプを、Visual Studio 2013 Ultimate を使用して解析します。
以下、2点に分けて紹介します。
3.1. メモリ使用状況の把握
3.2. メモリリークの特定

3.1. メモリ使用の概要把握
3.1.1. Visual Studio 2013 を起動し、”ファイル” –> “開く” –> “ファイル” をクリックします。
”ファイル” –> “開く” –> “ファイル”

3.1.2. ダンプファイルを選択します。
ダンプファイルを選択

3.1.3. “マネージ メモリのデバッグ” をクリックします。
マネージ メモリのデバッグ

3.1.4. メモリ使用状況がわかります。
以下の例では、”System.Byte[]” が一番メモリを食っていることがわかります。
メモリ使用の状況

3.1.5. “参照グラフ” を確認することもできます。
以下の例では、”System.Byte[]” は”MyMemoryDumpTest.Foo[]” により参照されていることがわかります。
参照グラフ

3.2. メモリリークの特定
二つの時間のメモリ使用量の比較を行うことにより、何がメモリリークを起こしているかを調べることができます。

3.2.1. 上記した「3.1.1.」 から「3.1.3.」 の手順を行い、ダンプを開きます。
ここでは、”MyMemoryDumpTest.DMP” を開きました。
MyMemoryDumpTest.DMP

3.2.2. “ベースラインの選択” の部分をクリックし”参照” をクリックします。
参照

3.2.3. 「3.2.1.」 で開いたダンプ以外のダンプを開きます。
ここでは、”MyMemoryDumpTest(2).DMP” を開きました。
MyMemoryDumpTest(2).DMP

3.2.4. 「3.2.1.」で開いたダンプと「3.2.3.」で開いたダンプ時のメモリ使用量の差分がわかります。
下記の例では、System.Byte[] のメモリ使用量の差が一番大きいことがわかります。
すなわち、System.Byte[] が、メモリリークが発生している可能性が高くなります。
メモリ使用量の差分

3.2.5. “参照グラフ” を確認することもできます。
結果、”MyMemoryDumpTest.Foo[]” により参照されていることがわかります。
参照グラフ

3.2.6. メモリリークの原因を突き止めます。
この時点で、プロジェクトを開き”Foo[]” を検索してみます。


すると、Foo[] はプログラムが終了するまで残る変数であることがわかります。
よって、今回はこれがメモリリークにつながっていたことがわかりました。
以下が今回のコードです。

using System;

namespace MyMemoryDumpTest
{
class Program
{
static Foo[] array; //Foo[]
static int i;

static void Main(string[] args)
{
array = new Foo[2048];
i = 0;

while(i<2048){
Console.ReadLine();
array[i] = new Foo();
i++;
}
}
}

public class Foo
{
private byte[] m_buffer = new byte[10240000]; //メモリを使う処理
}
}

リンク
・Using Visual Studio 2013 to Diagnose .NET Memory Issues in Production (英語)
本記事の元ネタです。
http://blogs.msdn.com/b/visualstudioalm/archive/2013/06/20/using-visual-studio-2013-to-diagnose-net-memory-issues-in-production.aspx

  1. 2013/09/01(日) 23:16:48|
  2. Visual Studio
  3. | トラックバック:0
  4. | コメント:0
<<誰がレジストリを変更したか? : 監査ポリシー | ホーム | 追加ソフトのインストールなくWindows 上でパケットキャプチャーを行い、それをWireshark で解析する方法>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/131-156072df
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。