dotMemoryというツールを私は自腹で持っているのですが、ほとんど使ったことがありませんでした。
職場でメモリリークと格闘した復習がてらブログに書きます。
基本操作
基本的な操作は公式ドキュメントを参考にすればいいと思います。
ライフゲームのアプリのメモリリークを解消するという実践的なチュートリアルもあります。
実際に動かしてみて思ったこと
チュートリアルのように話は現実は簡単な話ではありません。
GetSnapshotしたデータをCompareして、意図せずメモリが残っていることを見る事も必要ですが、単体で見た方がいいです。
Dominator
その中で、Dominatorタブに切り替えるのがオススメです。
メモリの中で、どのオブジェクトが多くを占めるかを知ることができます。
Inspections
Inspectionsではサマリーを参照することができます。
Event LeakやWPFでのネックとなるBinding Leakを検出するのに適しています。
Similer Retention
このオブジェクトは、どのクラスに属するオブジェクトか?ということを把握するのに役立ちます。
Stringオブジェクトなどは様々なクラスで使われるので、ただStringクラスがメモリリークしていると言われても具体的にどのクラスのメンバかはわかりません。
Dominatorでもその辺りはわかるのですが、Smiler Retentionでは具体的にこのクラスのどのメンバということもわかったりします。
こんなことには巻き込まれないことが理想
メモリ管理をガーベジコレクションに任せて開発効率を高めているので、メモリなんて考えないことが望ましいです。
- Subscribeしたイベントは、必ずUnsubscribeしなければならない
- Disposableなオブジェクトは、Disposeすること
など、お作法を守ることが大事ですが、シンプルに開発するのが望ましいです。
アプリとdotMemoryを動かしながら、コードを修正していくことは、メモリの挙動を見るのにとても勉強になります。
機会があれば一度はやってみることをお勧めします。
いきなりメモリリークをなんとかしろと言われると気が重いので、そうなる前に自分のお気に入りのアプリとdotMemoryで動かしてみるのがお勧めです。
複雑になったアプリケーションのメモリリークを完全に取り除くのは困難になります。
使われることがないメモリ割り当ての大きなメンバに対してnullを代入してガーベジコレクションに乗せる事でメモリリークの被害を抑えるという事もしましたが、ソースが意味不明になっていきますし、よろしいとは言えません。
手遅れにならないように、開発していく過程の中でメモリについても気を使って、計測していく方が良いです。