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を強制実行している。
namespace WindowsFormsApp1 { public class sample { public sample2 sp2 { get; set; } public sample() { sp2 = new sample2(); } public void sampleEvent() { return; } } public class sample2 { } }
ひとまずリークさせてスナップショットをとってみる。
上から起動直後。Button1クリック後、Button2クリック後のスナップ。
スナップショットはデフォルトでは直後のスナップと比較している。
よくわからなくなるから起動直後のスナップを選択しておく
なんだか怪しげなActionとSampleクラスがでてる。
よくあるイベント購読の解除漏れと、メンバ変数に参照抱えちゃったを実装しているので、
怪しいのが出るのは意図したとおり。これをひとつづつ解除してどうなるか。
イベント購読だけ対応してみると・・・
Actionとなんかもう一つも消えた・・・よくわからんが・・・
メンバ変数に抱え込まずにきちんと参照をちぎると・・・
なんか全部残るんですけど・・・
両方対応してみる。
不穏なやつはなくなってる。ひとまず対応的にはあっているよう
追加
いまいちよくわからなかったらタイミングできっちり変わるかブレーク決めながら、
スナップ取ってみた。
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; } }
スナップ1(起動時)⇒スナップ2(クリック直後)
スナップ2(クリック直後)⇒スナップ3(インスタンス生成後)
スナップ3(インスタンス生成後)⇒スナップ4(処理完了後)
という具合にきっちりメモリ確保⇒破棄。
が見れるみたい。ふーん