より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

dotMemoryでメモリの状況を把握する

dotMemoryというツールを私は自腹で持っているのですが、ほとんど使ったことがありませんでした。

www.jetbrains.com

職場でメモリリークと格闘した復習がてらブログに書きます。

基本操作

基本的な操作は公式ドキュメントを参考にすればいいと思います。

www.jetbrains.com

ライフゲームのアプリのメモリリークを解消するという実践的なチュートリアルもあります。

実際に動かしてみて思ったこと

チュートリアルのように話は現実は簡単な話ではありません。

GetSnapshotしたデータをCompareして、意図せずメモリが残っていることを見る事も必要ですが、単体で見た方がいいです。

Dominator

その中で、Dominatorタブに切り替えるのがオススメです。

f:id:rimever:20190302001314p:plain

メモリの中で、どのオブジェクトが多くを占めるかを知ることができます。

Inspections

Inspectionsではサマリーを参照することができます。

Event LeakやWPFでのネックとなるBinding Leakを検出するのに適しています。

f:id:rimever:20190302002409p:plain

Similer Retention

このオブジェクトは、どのクラスに属するオブジェクトか?ということを把握するのに役立ちます。

Stringオブジェクトなどは様々なクラスで使われるので、ただStringクラスがメモリリークしていると言われても具体的にどのクラスのメンバかはわかりません。

Dominatorでもその辺りはわかるのですが、Smiler Retentionでは具体的にこのクラスのどのメンバということもわかったりします。

f:id:rimever:20190302003242p:plain

こんなことには巻き込まれないことが理想

メモリ管理をガーベジコレクションに任せて開発効率を高めているので、メモリなんて考えないことが望ましいです。

  • Subscribeしたイベントは、必ずUnsubscribeしなければならない
  • Disposableなオブジェクトは、Disposeすること

など、お作法を守ることが大事ですが、シンプルに開発するのが望ましいです。

アプリとdotMemoryを動かしながら、コードを修正していくことは、メモリの挙動を見るのにとても勉強になります。

機会があれば一度はやってみることをお勧めします。

いきなりメモリリークをなんとかしろと言われると気が重いので、そうなる前に自分のお気に入りのアプリとdotMemoryで動かしてみるのがお勧めです。

複雑になったアプリケーションのメモリリークを完全に取り除くのは困難になります。

使われることがないメモリ割り当ての大きなメンバに対してnullを代入してガーベジコレクションに乗せる事でメモリリークの被害を抑えるという事もしましたが、ソースが意味不明になっていきますし、よろしいとは言えません。

手遅れにならないように、開発していく過程の中でメモリについても気を使って、計測していく方が良いです。