0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Visual Studioのパフォーマンスプロファイラ「メモリ使用量」でメモリーリークを調査

Last updated at Posted at 2025-01-25

概要

Visual Studio2022のパフォーマンスプロファイラでメモリーリークを調査してみます。

目的

メモリリークの調査時にはこれまで、パフォーマンスカウンターのみを使用していました。
開発環境においては、VisualStudioのパフォーマンスプロファイラの方が手軽に使用できそうだと感じたため、使用感を確かめます。

測定対象プログラムの準備

試しに次のプログラムを実行します。
(現実にはこんなプログラムはありませんが)

 internal class Program
 {
     static void Main(string[] args)
     {
         for (int i = 1; i < 1000; i++)
         {
             ManagementClass m = new ManagementClass("Win32_OperatingSystem");
             ManagementObjectCollection moc =  m.GetInstances();
         }
     }
 }

VisualStudioのパフォーマンスプロファイラからメモリ使用量を測定します

1.png

測定結果の分析

測定結果は次の通りです
1.png

ガベージコレクタが動いて定期的にメモリ解放はされていますが、
メモリ解放後の谷の高さが徐々に上昇しています。
同じ処理を繰り返していても、このように谷が上昇する場合は、メモリ解放漏れがあることを推察出来ます。

測定中に2回スナップショットを撮りましたので、差分を確認してみます。
2.png
マネージドメモリのスナップショット間での相違は0バイトでした。

3.png

「マイコードのみ表示」のチェックを外すと僅かに差異がありますが、16バイトなので谷の高さを押し上げる程のものではなさそうです。_ComObjectが増えているのが気になります。アンマネージドコードの解放漏れがあると推察できます。

ManagementClassクラスを調べると、リソース解放のためのDisposeメソッドがあることから、Disposeメソッドを呼ぶように変更します。

 internal class Program
 {
     static void Main(string[] args)
     {
         for (int i = 1; i < 1000; i++)
         {
             ManagementClass m = new ManagementClass("Win32_OperatingSystem");
             ManagementObjectCollection moc =  m.GetInstances();
             m.Dispose();
             moc.Dispose();
         }
     }
 }

メモリ使用量が減り、実行速度も倍以上早くなりました。

4.png

雑にタスクマネージャーで比較してみたところ、Dispose前はWMI関連のプロセスがCPUバウンドで遅くなっていたようです。

  • Dispose適用前
    1.png

  • Dispose適用後
    2.png

感想

手軽に使えて良いですね!
今回はアンマネージドオブジェクトでしたが、マネージドオブジェクトのメモリーリークなら、もっと楽に解決できそう。

補足

UserMarksを使うことでプロセスメモリのチャートにマーカーを置くことが出来ます

using Microsoft.DiagnosticsHub;
 var myUserMark = new UserMarks("MyMark");
 using (var myRange = new UserMarkRange("MyMethodRange"))
 {
    
 }
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?