こんにちは、Yu-saです。
どのようなシステムでも起こり得て、原因調査が難しいことが多いメモリリーク。
C言語のように自分でメモリを確保していればあたりがつけやすいのですが、C#のように自分でメモリを確保していない場合はオブジェクトを解放したつもりでも解放されていないなど、調査が大変です。
今回、VisualStudioの機能で原因箇所の特定が行えたので紹介いたします。
調査方法
VisualStudioには「パフォーマンス プロファイラー」という、アプリケーションのパフォーマンス測定を行うためのツールがあり、この機能を使用することでメモリ使用量を調査することが可能です。
(昔のVisualStudioには機能が存在していないかもしれません。今回はVisualStudio2019で確認しています。)
メモリ使用量の調査を行う場合、スナップショット間のメモリについて比較を行うことができます。
具体的な調査方法は以下のようになります。
①「デバッグ」→「パフォーマンス プロファイラー」を選択
②「メモリ使用量」にチェックをつけて「開始」を選択
開始を選択することで、アプリが実行されます。

③1回目のスナップショットを取得
計測が開始されると以下のような画面になります。
「スナップショットの取得」を選択することで比較する際の基準となるスナップショットを取得します。

④2回目のスナップショットを取得
メモリが増えている状態で比較に使用するスナップショットを取得。
⑤「収集の停止」を選択
停止することでレポートを確認することができます。
レポートの見方
以下のようなC#のコードを使用し、ボタンを押下する前と後でスナップショットを取得した際のレポートです。
namespace TestMemoryLeak
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<MemoryStream> m_listData = new List<MemoryStream>();
private void button_A_Click(object sender, EventArgs e)
{
for (int i = 0; i < 300; i++)
{
MemoryStream ms = new MemoryStream(new byte[50 * 1024]);
m_listData.Add(ms);
}
}
}
}

レポートが表示されると上記の画像のように、変化したメモリ量とオブジェクト数が表示され、クリックすることで詳細が表示されます。

今回の例では50KBのMemoryStreamが300個増えていることを確認することができます。
なお、マネージド・ヒープだけでなくネイティブ・ヒープについても確認することができます。
また、今回は紹介しませんが「パフォーマンス プロファイラー」ではCPU使用率などの調査も行うことができます。
いろいろな調査に活用ください。
最後に
今回メモリリークを調査するきっかけは、ライブラリを使用してデータベースにアクセスしている箇所で徐々にメモリが増えていっていることがきっかけでした。
アプリでは複数の処理が非同期で実行されており、原因箇所のあたりはつけることはできていたのですが、特定までにはいたっておりませんでした。
今回紹介した機能によって原因の特定をすることができました。
今回紹介した機能で必ずしも解決するわけでは無いとは思いますが、いろいろな方法で調査することにより、問題解決の手助けになれば幸いです。
関連記事
-
第1回 Visual C++で作成したDLL内のクラスをC#で利用する方法
こんにちは、ILCです。 Visual C++ (以下 VC++)で作成されたDynamic...
公開日:2024.01.19 更新日:2024.01.19
tag : Windows
-
-
-
第1回 ラズパイを使用したBLE通信 ~ ディスプレイ、キーボード、マウスを接続しないで設定 前編 ~
こんにちは、GTです。よろしくお願いします。 最近業務でラズパイのBluetooth機能を使...
公開日:2021.12.24 更新日:2021.12.24
tag : Bluetooth Raspberry Pi
-
【新機能探訪】Android 13から導入された『アプリごとの言語設定』
こんにちは、KNSKです。よろしくお願いします。 今回は Android13の新機能である『...
公開日:2022.12.09 更新日:2022.12.09
tag : スマートデバイス
-
こんにちは。WwWです。 システム系の開発をしていると様々な問題が起こります。 そこで今回は...
公開日:2023.04.28 更新日:2023.04.28