Il arrive parfois qu'il faille faire un choix entre performances, et consommation mémoire. Les références faibles sont justement ici pour nous éviter à faire ce choix. Elles permettent de ne garder en mémoire un (gros) objet que si l'espace mémoire est suffisant.
Exemple :
Je fais une visionneuse d'images. Au clic sur l'image 1, on va chercher sur le disque dur le contenu bitmap de celle-ci pour la mettre en RAM, puis on l'affiche dans un picture box.
Au clic sur l'image 2, le même process est utilisé : Récupération depuis le disque dur + mise en RAM + affichage.
Mais si je reclique sur l'image 1, il est dommage de rechercher l'image depuis le disque dur... le mieux pour la rapidité serait d'aller la chercher depuis la RAM... Le problème est que l'on ne va pas laisser en RAM toutes les images sous prétexte que l'utilisateur à cliqué une fois dessus...
Nous allons donc charger chaque image dans une référence faible, dès que l'utilisateur aura cliqué dessus. Ainsi, la seconde fois que l'on va cliquer sur une image elle sera soit :
- chargée depuis la RAM,
- chargée depuis le disque dur car le garbage collector aura considéré qu'il était nécessaire de "désaturer" l'espace mémoire.
Nous avons donc réussi à trouver, grâce aux références faibles, un compromis simple entre rapidité et consommation mémoire.
En résumé, pour utiliser les weak references sur un objet, il faut que :
- L'objet en question ne soit pointé QUE par cette référence faible,
(ET SURTOUT)
- L'objet puisse être récupéré (ou reconstitué, ou désérialisé, ou ce que vous voulez) depuis un autre endroit que la RAM, car si le garbage collector décide de vider la mémoire de votre objet, vous le perdez.
Pour l'exemple, vous pouvez le tester de la façon suivante :
Lancez l'exe, puis cliquez sur l'image 1 (apparition d'un log "Chargement depuis le disque dur"). Cliquez sur l'image 2 (apparition d'un log "Chargement depuis le disque dur"). Si vous cliquez une nouvelle fois sur l'image 1, aucune ligne de log ne doit normalement apparaître. Par contre, si vous laissez reposer le prog, et que vous faites autre chose qui consomme de la mémoire et que vous revenez sur le prog, alors de nouvelles lignes de log doivent apparaître pour signifier que les images sont rechargées depuis le disque dur.
Bon coding à tous !