長時間稼働するシステムでは、わずかなメモリリークでも少しずつ蓄積していき、そのうちシステムに深刻な影響を与えます。しかし、実際にはそのわずかなメモリリークが存在するかしないかを把握するのは困難です。
そこで、とりあえず同じ処理を何度も繰り返し実行するというテストをするのですが、その結果を見ても、すぐにリークがありそうかどうかがわかりにくく、なんとか簡単に速く判断できないか工夫してみました。
パフォーマンスモニタでメモリ使用量を監視する
まずはWindows標準のパフォーマンスモニタでメモリ使用量を取り出します。
詳細な手順は省略しますが、対象となるプロセスのPrivate Bytesをcsv出力し、そのままエクセルに貼り付けて折れ線グラフにすると、以下のようになりました。
単純に開始時点と終了時点だけを比べると終了時点の方がメモリ使用量は多いのですが、数十回繰り返された中でのリークかというと、そうとも限りません。
ちなみに終盤の動きがなだらかなのは、メインの処理を予定回数繰り返し実行した後のアイドリング状態です。
複雑な折れ線グラフから傾向を見る
エクセルの折れ線グラフには、「近似曲線」という機能があるので、それを表示します。
メニューから選択するか、グラフ上のコンテキストメニューからすぐに設定できます。
先ほどのグラフに線形近似曲線を追加すると以下のようになりました。
右下の数式は追加された近似曲線を表す二次方程式です。
上図ではxの係数が小数表示ですが、0に近い場合は指数表示になるので「y=-2E-06 + 3E+07」みたいになります。
ちょっとこのままでは見にくいので、このラベルの書式設定を行いました。
常に小数表示で、ついでに背景塗り込みも設定しました。
xの係数が負数なので右下がりです。
約27という数字は大きそうですが、データ数が約8000なので大体200KB分の減少傾向です。
実際には処理の中で確保した分が、最後のアイドリング状態で解放されているという感じです。
まだまだ工夫が必要
何気なくアイドリング状態という部分を入れていますが、これがないと以下のようになります。
計測開始時ではまだ大きな処理に入っていないためかメモリ使用量が若干低めなので、その分で全体的に増加傾向に見えてしまいます。特に今回はC#のプログラムなので、処理完了時点で使用しなくなったメモリがまだ開放されていないことも考慮が必要です。
では後ろのアイドリングをどれくらい含めたらいいのかは、対象となるプログラムの傾向もあるし、状況に応じて試行錯誤する必要があると思われます。