AfxFreeLibrary を使用してアンマネージド ライブラリをアンロードすることで、マネージド アプリのワーキング セットを減らすことができますか?
質問
クライアント マシン上にサードパーティ コンポーネントが存在する場合、AfxLoadLibrary を使用してサードパーティ コンポーネントをロードするマネージド C++ コンポーネントをロードするマネージド Windows アプリケーションがあります。検出されたら、マネージド親アプリケーションのワーキング セットを下げるために、AfxFreeLibrary を使用してコンポーネントをアンロードします。
AfxFreeLibrary への呼び出しは成功しました (Process Explorer を使用して確認) が、メモリは解放されません。これはマネージド アプリケーションの性質によるものですか、それともこのプロセス領域を解放する方法はありますか?
コードはすでに実稼働環境にあるため、一般的にこの問題に取り組むための代替方法を探しているわけではありません。むしろ、アンロードするアプローチが価値があるかどうかを知りたいと思っています。
解決
そうなるはずです。純粋なネイティブ アプリを作成してワーキング セットを確認することで、それを証明できます。ただし、ワーキング セットはアプリの実行に必要なメモリのサイズであるため、DLL で使用されるコードをスワップアウトできる場合、ワーキング セットは減りません。Windows はそれをワーキング セットの一部としてカウントしません。 。
DLL にプロセスに割り当てられたプライベート メモリがあり、スワップできない場合は、それが重要となり、ワーキング セットが減少します。
したがって、答えはそれは状況によるということです。違いが生じることは保証されておらず、dll が使用されていない場合、dll はスワップアウトされ、現在のワーキング セットの一部ではありません。整理整頓したくない場合は、わざわざ降ろさないほうが良いでしょう。
ワーキング セットを減らす唯一の方法は、アプリで使用するメモリを減らすことです。これは .NET アプリであるため、ほとんど制御できない可能性があります (GC は、ワーキング セットで「アクティブ」なメモリの量と必要なメモリの量を独自に判断するため)