Références logicielles en Java

1. Vue d'ensemble

Dans cet article rapide, nous parlerons des références logicielles en Java.

Nous vous expliquerons ce qu'ils sont, pourquoi nous en avons besoin et comment les créer.

2. Que sont les références souples?

Un objet de référence souple (ou un objet accessible en douceur) peut être effacé par le garbage collector en réponse à une demande de mémoire. Un objet accessible en douceur n'a pas de références fortes pointant vers lui .

Lorsqu'un garbage collector est appelé, il commence à itérer sur tous les éléments du tas. GC stocke les objets de type référence dans une file d'attente spéciale.

Une fois tous les objets du tas vérifiés, GC détermine quelles instances doivent être supprimées en supprimant les objets de la file d'attente mentionnée ci-dessus.

Ces règles varient d'une implémentation JVM à une autre, mais la documentation indique que toutes les références logicielles à des objets accessibles en douceur sont assurées d'être effacées avant qu'une JVM ne lève une OutOfMemoryError.

Cependant, aucune garantie n'est donnée sur le moment où une référence souple est effacée ou sur l'ordre dans lequel un ensemble de telles références à différents objets est effacé.

En règle générale, les implémentations JVM choisissent entre le nettoyage des références récemment créées ou récemment utilisées.

Les objets accessibles en douceur resteront actifs pendant un certain temps après la dernière fois qu'ils sont référencés. La valeur par défaut est une seconde de durée de vie par mégaoctet libre dans le tas. Cette valeur peut être ajustée à l'aide de l' indicateur -XX: SoftRefLRUPolicyMSPerMB .

Par exemple, pour changer la valeur à 2,5 secondes (2500 millisecondes), nous pouvons utiliser:

-XX:SoftRefLRUPolicyMSPerMB=2500

Par rapport aux références faibles, les références souples peuvent avoir des durées de vie plus longues puisqu'elles continuent d'exister jusqu'à ce que de la mémoire supplémentaire soit requise.

Par conséquent, ils constituent un meilleur choix si nous devons conserver les objets en mémoire le plus longtemps possible.

3. Cas d'utilisation des références logicielles

Les références logicielles peuvent être utilisées pour implémenter des caches sensibles à la mémoire où la gestion de la mémoire est un facteur très important.

Tant que le référent d'une référence souple est fortement accessible, c'est-à-dire qu'il est effectivement utilisé, la référence ne sera pas effacée.

Un cache peut, par exemple, empêcher la suppression de ses entrées les plus récemment utilisées en conservant des référents forts pour ces entrées, laissant les entrées restantes à supprimer à la discrétion du garbage collector.

4. Travailler avec des références souples

En Java, une référence logicielle est représentée par la classe java.lang.ref.SoftReference .

Nous avons deux options pour l'initialiser.

La première façon est de passer un référent uniquement:

StringBuilder builder = new StringBuilder(); SoftReference reference1 = new SoftReference(builder);

La deuxième option implique de passer une référence à un java.lang.ref.ReferenceQueue ainsi qu'une référence à un référent. Les files d'attente de référence sont conçues pour nous informer des actions effectuées par le garbage collector. Il ajoute un objet de référence à une file d'attente de références lorsqu'il décide de supprimer le référent de cette référence.

Voici comment initialiser une SoftReference avec une ReferenceQueue:

ReferenceQueue referenceQueue = new ReferenceQueue(); SoftReference reference2 = new SoftReference(builder, referenceQueue);

En tant que java.lang.ref.Reference , il contient les méthodes get et clear pour obtenir et réinitialiser un référent respectivement:

StringBuilder builder1 = reference2.get(); reference2.clear(); StringBuilder builder2 = reference2.get(); // null 

Chaque fois que nous travaillons avec ce type de références, nous devons nous assurer qu'un référent, renvoyé par le get , est présent:

StringBuilder builder3 = reference2.get(); if (builder3 != null) { // GC hasn't removed the instance yet } else { // GC has cleared the instance }

5. Conclusion

Dans ce didacticiel, nous nous sommes familiarisés avec le concept de références logicielles et leurs cas d'utilisation.

De plus, nous avons appris à en créer un et à l'utiliser par programmation.