Je connais WeakReference
mais je cherche un type de référence qui soit effacé. sólo lorsque la mémoire est faible, et non pas simplement à chaque fois que le gc s'exécute (tout comme le gc de Java). SoftReference
). Je cherche un moyen d'implémenter un cache sensible à la mémoire.
Réponses
Trop de publicités?Le cache ASP.NET vous donne le comportement sensible à la mémoire que vous souhaitez, avec l'inconvénient que tout doit avoir une clé unique. Toutefois, vous devriez être en mesure de conserver une référence faible à un objet que vous avez placé dans le cache d'ASP.NET. La référence forte du cache tiendra la GC à distance jusqu'à ce que le cache décide qu'il doit être récupéré pour libérer de la mémoire. La WeakReference vous permet d'accéder à l'objet sans avoir à consulter la clé du cache.
Foo cachedData = new Foo();
WeakReference weakRef = new WeakReference( cachedData );
HttpRuntime.Cache[Guid.NewGuid().ToString()] = cachedData;
...
if ( weakRef.IsAlive )
{
Foo strongRef = weakRef.Target as Foo;
}
Vous pourriez créer une classe SoftReference en étendant WeakReference selon le modèle suivant
class SoftReference : WeakReference
{
public SoftReference( object target ) : base( target )
{
HttpRuntime.Cache[Guid.NewGuid().ToString()] = target;
}
}
Vous devrez également remplacer le paramètre setter sur Target pour vous assurer que toute nouvelle cible est placée dans le cache.
Peut-être que la classe ASP.NET Cache ( System.Web.Caching.Cache ) pourrait vous aider à obtenir ce que vous voulez ? Il supprime automatiquement les objets si la mémoire devient faible :
Voici un article qui montre comment utiliser la classe Cache dans une application Windows forms.
Bien qu'un SoftReference
peut sembler être un moyen pratique d'implémenter la mise en cache de la mémoire, il exige que le runtime Java détermine de manière quelque peu arbitraire si l'avantage de conserver un objet dépasse le coût de son stockage. Malheureusement, le runtime ne dispose que d'informations limitées sur le coût réel de la conservation d'un objet (sachant que le coût réel peut inclure l'impact de l'utilisation de la mémoire d'une application sur d'autres applications), et pratiquement aucune information sur l'avantage de conserver l'objet.
S'il vaut la peine de conserver un objet même s'il n'existe aucune référence forte extérieure à cet objet, un cache devrait conserver une référence forte à cet objet (au moins aussi longtemps que cela semble utile). Si l'avantage de garder l'objet dans le cache ne dure que tant qu'une référence extérieure existe (par exemple, parce que la production d'instances est bon marché, mais que le fait que deux entités logiques qui contiennent des données identiques utilisent la même instance pour les contenir faciliterait les comparaisons entre ces entités), on devrait utiliser une référence forte à l'objet. WeakReference
.
Par ailleurs, si j'avais le choix, .net prendrait en charge un autre type de référence que je n'ai jamais vu sur aucune plate-forme : une référence "intéressant quelqu'un d'autre", qui serait utilisée en conjonction avec un type de référence de type WeakReference
. Une référence "d'intérêt pour quelqu'un d'autre" pourrait être utilisée comme une référence forte, mais une référence de type WeakReference
serait invalidée si les seules références fortes à sa cible étaient "d'intérêt pour quelqu'un d'autre". Un tel concept pourrait améliorer l'efficacité lors de l'utilisation d'un GC concurrent, dans les cas où un gestionnaire d'événement faible génère de manière répétée une référence forte à sa cible. Si personne n'est vraiment intéressé par ce que le gestionnaire d'événements fait avec sa cible, il serait souhaitable que le gestionnaire puisse être désabonné.
Non, il n'y a pas d'équivalent. Y a-t-il une raison particulière pour laquelle WeakReference
ne fera pas l'affaire ?
Voici une question similaire à la vôtre :
Pourquoi .NET ne dispose-t-il pas d'une SoftReference ainsi que d'une WeakReference, comme Java ?