Skip to content

Java, WeakReference et WeakHashMap

Voici un petit topo rapide sur un élément peu connu du fonctionnement du Garbage Collector Java : les WeakReferences.

Les WeakReferences permettent de référencer un objet sans le « locker » vis-à-vis du Garbage Collector.

Imaginons que vous ayez un ensemble d’objets dont vous voulez stocker le timestamp de création, vous pouvez par exemple utiliser une HashMap :

Map<MonObjet, Long> maHashMap = new HashMap<MonObjet,Long>();
...
maHashMap.put(unObjet,System.currentTimeMillis());
...

Maintenant, imaginons que votre objet ne soit plus utile.
Si vous oubliez de supprimer cet objet de la hashmap, il restera en mémoire, le garbage collector ne libérera jamais cet objet, car il est référencé par la map.
Vous ne devez donc pas oublier de faire un remove(), sinon, vous aurez une fuite mémoire !

Grâce aux WeakReferences et plus précisément l’objet WeakHashMap, vous avez une alternative face à ce problème. Remplacez votre code par :

Map<MonObjet, Long> maHashMap = new WeakHashMap<MonObjet,Long>();
...
maHashMap.put(unObjet,System.currentTimeMillis());
...

Quelle est la différence ? L’utilisation d’une WeakReference sur la clé de la HashMap !

Concrètement, ça signifie que si votre objet n’est plus référencé nulle part, il disparaîtra de votre Map dès le passage du Garbage Collector. Magique : plus de risque de fuite mémoire !

[ Ethan Nicholas’s Blog : Understanding Weak References ]

Published inProgrammation
Loading Facebook Comments ...

4 Comments

  1. Retrouvez cet article sur Blogasty …

    Vous aimez cet article? Votez pour lui sur Blogasty …

  2. Supremator Supremator

    Ah ben ça fait des années que j’en entends parler sans trop y accorder d’importance, et ça y’est, en 30 secondes tout s’éclaire… merci 😉

    • Gerben CASTEL Gerben CASTEL

      Si on peut aider :-)

      C’est ce qui est bien avec Java : 10 ans après avoir commencé j’apprends toujours des choses !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.