ドキュメントを読むと、キャッシュはキャッシュしているオブジェクトのサイズを計算しようとしません。これは、プロセス自体から任意の型(固定サイズの構造体、または固定サイズの構造体の配列に対して行うことはできますが、それについてはそれを行うことができます)では実行できないものなので意味があります。グーグルのビットがあなたにそれを確認します。しかし、どのくらいのRAMがコンピュータ上で利用可能であるかはわかります。あなたはnew Microsoft.VisualBasic.Devices.ComputerInfo().AvailablePhysicalMemory
からあなた自身を得ることができます。したがって、おそらくキャッシュは2つのことを行います:
- 各オブジェクトが最後に使用されたときに追跡されます。
- 一定の間隔でメモリ統計をポーリングします。
次に、各ポーリングで、使用可能なメモリの量が許容範囲内にあるか、そうでないかのいずれかです。それが許容範囲内であれば、何もしません。そうでない場合は、項目の削除が開始され、最後に最後にアクセスされた項目が最初に削除されます。メモリが許容範囲内に戻るまでアイテムを削除し続けます。あなたが考えてみれば
はそれはかなりあなたがキャッシュに利用可能な情報を使用して実行できるすべてです。
この戦略はOKですが、キャッシュから項目を削除すると、ガベージコレクションのためにそれを解放しませんので、キャッシュ内の項目への参照を保持している他のオブジェクトを持っている場合、それは明らかに分解します。これは、オブジェクトへの参照がなくなるようにクリーンアップを実行するコールバックのポイントです。
私は、キャッシュがキャッシュ内のオブジェクトのサイズを計算しようとすることができます確信しています。 (a)任意のオブジェクトのサイズがキャッシュに挿入された後に変更される可能性があり、(b)キャッシュされたオブジェクトのフィールドによって参照されるオブジェクトへの他の参照が存在する可能性があるので、そうすることは無益である。キャッシュから取り除いても必ずしもすべてのメモリが解放されるわけではありません。 – Joe
はそれがないものは何でも、それはこの方法で実装されています:http://referencesource.microsoft.com/#mscorlib/system/gc.cs,6da6dff768f373f5 – fernacolo
は、質問の内容を変更しました。 –