VB.Netで作成したアプリのメモリリークを解決したい

実現したいこと

VB.Netで作成したアプリのメモリリークを解決したい。
・タスクマネージャー上のワーキングセットを肥大化していくためこれを抑制、もしくは一定期間で破棄を行いたい。

前提

・.Net Framework 4.5 をターゲットフレームワークとしています。
・Windowsサービスとして構成し、処理クラスをサービスからインスタンス化して実行しています。
・処理クラスはThreading.Timerを使ってファイル監視を行い、ファイルが存在した場合に内容を読み込んでODBCによりDB更新を行っています。

発生している問題・エラーメッセージ

現象としてはファイル(20KB~78KB)を処理するにともなってタスマネージャー上のワーキングセットが肥大化しており、これがサーバー実行上3日間ぐらいの稼働(原則24時間稼働)で10GBを超えることから何とかリークを解消したいという思いです。
開発端末(Windows10)では完全無風状態が続くと、タスクマネージャー上のワーキングセットが減少しますが、顧客環境のWindowsサーバー上では減少しているのかいまいち把握できないのと、もっと早いタイミングで減少させたいという思いです。

【質問事項】
先輩方にお聞きしたいのが、VisualStudio2019のデバッグでメモリの状況を確認しているとプロセスメモリ(MB)が368MB以上にも係わらずスナップショットを取るとヒープサイズは1Mとなっています。
このプロセスメモリの内容調査をしたい場合どのような手法があるでしょうか。
イメージ説明

該当のソースコード

VB.Net

12### 試したこと 3・Fileへのアクセス時のUsing使用 4・ODBCオブジェクトUsing使用 5・内部変数の破棄 6・内部のStringクラスの使用をやめる検討 7・内部クラスでDisposeを実装してクラス変数のDictionaryのすべてのキーのRemoveを実行する。 8・関数で使用している内部変数をFinallyブロックを作成して破棄 等...

###追記
WinDBGを使用してダンプの解析を行ってみた内容です。
・ヒープに割り当たっているメモリ(heap -s 0)の予約、コミットはタスクマネージャーと近しい数値が見えました。
・割り当てされたオブジェクトサイズごとの一覧(heap -stat -h 0)ではやはり小さい数字の合計しか取れませんでした。
・リークしたヒープ(heap -l)を取ると確かに大量にCountのメモリが検出されますがトータルサイズですと、タスクマネージャーのワーキングセットの大きさにはならず。

コメントを投稿

0 コメント