Références logicielles en Java

Références soft en Java

1. Vue d'ensemble

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

Nous 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 facilement accessible) peut être effacé par le récupérateur de place en réponse à une demande de mémoire. A softly reachable object has no strong references pointing to it.

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

Une fois tous les objets du segment de mémoire vérifiés, GC détermine les instances à supprimer 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 queall soft references to softly-reachable objects are guaranteed to be cleared before a JVM throws an OutOfMemoryError.

Cependant, aucune garantie n'est donnée sur le moment où une référence logicielle est effacée ou 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 des références récemment utilisées.

Les objets facilement accessibles resteront actifs pendant un certain temps après leur dernière référence. 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 modifier la valeur à 2,5 secondes (2500 millisecondes), nous pouvons utiliser:

-XX:SoftRefLRUPolicyMSPerMB=2500

Par rapport aux références faibles, les références logicielles peuvent avoir une durée de vie plus longue car elles continuent d'exister jusqu'à ce que de la mémoire supplémentaire soit nécessaire.

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

Soft references can be used for implementing memory-sensitive caches 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 le rejet de ses entrées les plus récemment utilisées en conservant des référents forts sur ces entrées, laissant ainsi les entrées restantes à la discrétion du récupérateur de place.

4. Travailler avec des références souples

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

Nous avons deux options pour l'initialiser.

La première consiste à ne transmettre qu'un référent:

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

La deuxième option implique de passer une référence à unjava.lang.ref.ReferenceQueue ainsi qu'une référence à un référent. Reference queues are designed for making us aware of actions performed by the Garbage Collector. Il ajoute un objet de référence à une file d'attente de référence lorsqu'il décide de supprimer le référent de cette référence.

Voici comment initialiser unSoftReference avec unReferenceQueue:

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

En tant quejava.lang.ref.Reference, il contient les méthodesget etclear 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 lesget, 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 tutoriel, 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.