Suite à l’article précédent sur les WeakReferences, voici un petit topo sur les SoftReferences. (ça a mis le temps, mais j’ai eu peu de disponibilités récemment )
Il existe donc un autre type de référence, les SoftReferences, qui sont plus faibles que les WeakReferences, en effet, un objet lié par une SoftReference est éligible à la garbage collection si la JVM est saturée.
En gros, une WeakReference pourra disparaître à la prochaine garbage collection, tandis qu’une SoftReference restera en mémoire jusqu’à saturation, et là, elle sera garbage collectée.
Il ne faut donc utiliser ces références que :
- si vous pouvez facilement remonter l’objet concerné en mémoire
- si vous voulez gérer un cache de données que vous avez déjà remontées et que vous voudriez potentiellement réutiliser.
Par exemple, dans une application qui affiche les couvertures de livres d’un utilisateur de bibliothèque, avec pagination.
Vous pouvez vouloir garder en mémoire les images de chaque livre disponible pour optimiser la navigation, sans pour autant bloquer la mémoire. Vous pouvez mettre en place un mécanisme du type :
public class Livre {
private String titre = null;
private SoftReference couverture = new SoftReference(null);
...
public Image getCouverture() {
Image imageCouverture = couverture.get();
if (imageCouverture == null) {
rechargeImage();
}
}
...
}
Dans ce code, l’image de la couverture est relue depuis le disque si elle n’est pas disponible et reste en mémoire jusqu’à une saturation de la mémoire, puis garbage collection.
Il faut bien faire attention à tester le null, car elle peut disparaître de la mémoire sans prévenir.
[ Ethan Nicholas’s Blog : Understanding Weak References ]
Update :
La bibliothèque Google Guava fournit une classe MapMaker qui permet de générer des ConcurrentMap dont les clés/valeurs peuvent être des Weak ou Soft references.
Retrouvez cet article sur Blogasty …
Vous aimez cet article? Votez pour lui sur Blogasty …
Ton article est très intéressant, je connaissais les WeakReference mais pas les Soft.
J’ai essayé de les utiliser dans la mise en place d’un cache : je cherche dans le cache, si l’objet n’y est pas ou si le get() renvoie null je fais un appel a la base de donnée pour récupérer les infos nécessaires.
Hélas, je me retrouve très souvent avec get() qui retourne null et l’obligation de faire un appel bdd. Ce qui réduit l’utilité de mon cache à presque rien.
Les SoftReference sont éligibles au garbage collector d’accord, mais comment savoir pourquoi elles sont si souvent nettoyées ?
Le soucis, c’est que l’implémentation des SoftReference est liée à l’appréciation du développeur de la JVM, de plus, on a peu de garanties sur son comportement.
Je t’invite à consulter la javadoc :
http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/ref/SoftReference.html
Et tu constateras que les garanties restent floues :
« Virtual machine implementations are, however, encouraged to bias against clearing recently-created or recently-used soft references. «
Un petit complément sur les références et la garbage collection :
http://crazybobs-talks.googlecode.com/svn/trunk/out/references.pdf
[…] des SoftReference ou WeakReference comme clé ou valeur de la […]