調べ物した結果

現役SEが仕事と直接関係ないことを調べた結果とか感想とか

VisualStdio2017 パフォーマンス診断ツールでメモリリークの調査~そういえば使ったことないから試しに使ってみた~

とにかく・・・

https://qiita.com/ryo-pinus/items/8141c749168ea321937c

https://docs.microsoft.com/ja-jp/visualstudio/profiling/memory-usage?view=vs-2019
を見ればばっちり解決するはず。
あとはやってみた結果

やってみた

安心・安全のWindowsフォーム。Button1でリークして、Button2はGCを強制実行している。
f:id:couraeg:20190617225928p:plain
f:id:couraeg:20190617230030p:plain

namespace WindowsFormsApp1
{
    public class sample
    {
        public sample2 sp2 { get; set; }
        public sample()
        {
            sp2 = new sample2();
        }
        public void sampleEvent()
        {
            return;
        }
    }

    public class sample2
    {
    }
}

ひとまずリークさせてスナップショットをとってみる。
上から起動直後。Button1クリック後、Button2クリック後のスナップ。
f:id:couraeg:20190617230153p:plain

スナップショットはデフォルトでは直後のスナップと比較している。
よくわからなくなるから起動直後のスナップを選択しておく
f:id:couraeg:20190617230304p:plain

なんだか怪しげなActionとSampleクラスがでてる。
よくあるイベント購読の解除漏れと、メンバ変数に参照抱えちゃったを実装しているので、
怪しいのが出るのは意図したとおり。これをひとつづつ解除してどうなるか。

イベント購読だけ対応してみると・・・

f:id:couraeg:20190617230709p:plain
Actionとなんかもう一つも消えた・・・よくわからんが・・・

メンバ変数に抱え込まずにきちんと参照をちぎると・・・

f:id:couraeg:20190617230858p:plain
なんか全部残るんですけど・・・

両方対応してみる。

f:id:couraeg:20190617232148p:plain
不穏なやつはなくなってる。ひとまず対応的にはあっているよう

追加

いまいちよくわからなかったらタイミングできっちり変わるかブレーク決めながら、
スナップ取ってみた。

namespace WindowsFormsApp1
{
    public class sample
    {
        public sample2 sp2 { get; set; }
        public sample()
        {
            sp2 = new sample2();
        }
        public void sampleEvent()
        {
            return;
        }
    }

    public class sample2
    {
    }

    /// <summary>
    /// メンバ変数に抱えさせる
    /// </summary>
    public class sample3
    {
        // こいつを参照させてる
        public sample4 sp4 { get; set; }
    }
    public class sample4
    {
        private string aaa;
        private int bbb;
    }
}

f:id:couraeg:20190617233242p:plain

スナップ1(起動時)⇒スナップ2(クリック直後)
f:id:couraeg:20190617233424p:plain
スナップ2(クリック直後)⇒スナップ3(インスタンス生成後)
f:id:couraeg:20190617233526p:plain
スナップ3(インスタンス生成後)⇒スナップ4(処理完了後)
f:id:couraeg:20190617235945p:plain


という具合にきっちりメモリ確保⇒破棄。
が見れるみたい。ふーん