私は に精通していますが、単に gc が実行されるたびに (Java の のように) ではなく、メモリが少ない場合にのみWeakReference
クリアされる参照型を探しています。メモリに依存するキャッシュを実装する方法を探しています。SoftReference
5 に答える
ASP.NET キャッシュは、必要なメモリ依存の動作を提供しますが、すべてに一意のキーが必要であるという欠点があります。ただし、ASP.NET キャッシュに配置したオブジェクトへの WeakReference を保持できる必要があります。キャッシュの強い参照は、メモリを解放するためにキャッシュを清掃する必要があるとキャッシュが判断するまで、GC を寄せ付けません。WeakReference を使用すると、キャッシュ キーでルックアップを行わずにオブジェクトにアクセスできます。
Foo cachedData = new Foo();
WeakReference weakRef = new WeakReference( cachedData );
HttpRuntime.Cache[Guid.NewGuid().ToString()] = cachedData;
...
if ( weakRef.IsAlive )
{
Foo strongRef = weakRef.Target as Foo;
}
次の行に沿って WeakReference を拡張することにより、SoftReference クラスを作成できます。
class SoftReference : WeakReference
{
public SoftReference( object target ) : base( target )
{
HttpRuntime.Cache[Guid.NewGuid().ToString()] = target;
}
}
また、Target のセッターをオーバーライドして、新しいターゲットが確実にキャッシュに入るようにする必要があります。
おそらく、ASP.NET キャッシュ クラス ( System.Web.Caching.Cache ) が目的を達成するのに役立つでしょうか? メモリが少なくなると、オブジェクトを自動的に削除します。
これは、Windows フォーム アプリケーションで Cache クラスを使用する方法を示す記事です。
ASP.NET キャッシュに加えて、Microsoft Patterns and Practices グループの Caching Application Block があります。
SoftReference
メモリ キャッシングを実装するのに便利な方法のように思えるかもしれませんが、Java ランタイムは、オブジェクトを保持する利点がオブジェクトを格納するコストを上回るかどうかについて、いくぶん恣意的な判断を下す必要があります。残念ながら、ランタイムは、オブジェクトを維持するための実際のコストに関する情報を制限しており (実際のコストには、アプリケーションのメモリ使用量が他のアプリケーションに与える影響が含まれる可能性があることに注意してください)、オブジェクトを維持する利点に関する情報は事実上ありません。 .
オブジェクトへの外部の強い参照が存在しない場合でも、オブジェクトを保持する価値がある場合は、キャッシュはそのオブジェクトへの強い参照を保持する必要があります (少なくとも、価値があると思われる限り)。オブジェクトをキャッシュに保持することによる利点が、外部参照が存在する場合にのみ拡張される場合 (たとえば、インスタンスの生成は安価ですが、同一のデータを保持する 2 つの論理エンティティが同じインスタンスを使用してそれらを保持するため、それらのエンティティ間の比較が容易になるため) ) を使用する必要がありますWeakReference
。
ちなみに、私がドラザーを持っていれば、.net は、どのプラットフォームでも見たことのない別の種類の参照をサポートするでしょうWeakReference
。「他の誰かにとって興味深い」参照は強い参照として使用できますが、WeakReference
そのターゲットへの唯一の強い参照が「他の誰かにとって興味深い」ものである場合、適切に構成されたものは無効になります。このような概念は、弱いイベント ハンドラーがそのターゲットへの強い参照を繰り返し生成する場合に、同時 GC を使用する場合の効率を向上させる可能性があります。イベント ハンドラーがそのターゲットに対して行っていることに誰も興味がない場合は、ハンドラーのサブスクライブを解除できることが望ましいでしょう。
いいえ、同等のものはありません。WeakReference
仕事をやらない特別な理由はありますか?
あなたと同様の質問があります: