82 votes

La compréhension de Java classes de Référence: SoftReference, WeakReference, et PhantomReference

Quelqu'un peut m'expliquer la différence entre les trois classes de Référence (ou poster un lien vers une belle explication)? SoftReference > WeakReference > PhantomReference, mais quand aurais-je les utiliser? Pourquoi est-il un WeakHashMap mais n' SoftHashMap ou PhantomHashMap?

Et si j'utilise le code suivant...

WeakReference<String> ref = new WeakReference<String>("Hello!");
if (ref != null) {                 // ref can get collected at any time...
    System.gc();                   // Let's assume ref gets collected here.
    System.out.println(ref.get()); // Now what?!
}

...ce qui se passe? Dois-je vérifier si ref est null, avant chaque instruction (ce qui est faux, mais que doit - je faire)? Désolé pour la rapidité de tir questions, mais je vais avoir du mal à comprendre ces Reference classes... Merci!

61voto

seh Points 8533

La bibliothèque Java de la documentation pour l' java.lang.ref package caractérise la diminution de la force des trois explicite des types référence.

Vous utilisez un SoftReference lorsque vous souhaitez que l'objet référencé pour rester en vie jusqu'à ce que le processus hôte est en cours d'exécution faible sur la mémoire. L'objet ne seront pas admissibles pour la collecte jusqu'à ce que le collecteur de besoins pour libérer de la mémoire. Vaguement dit, la liaison d'un SoftReference "signifie" Pin de l'objet jusqu'à ce que vous ne pouvez pas plus."

En revanche, l'utilisation d'un WeakReference lorsque vous ne voulez pas de l'influence de l'objet référencé de la vie; vous voulez simplement faire un autre affirmation à propos de l'objet référencé, tant qu'il reste en vie. L'objet d'admissibilité pour la collecte n'est pas influencée par la présence de liés WeakReferences. Quelque chose comme un mapping externe de l'objet de l'instance liée à la propriété, d'où la propriété doit être enregistrée tant que l'objet est vivant, est un bon usage pour WeakReferences et WeakHashMap.

Le dernier-PhantomReference-est plus difficile à caractériser. Comme WeakReference, une telle liés PhantomReference n'a pas d'influence sur l'objet référencé de sa vie. Mais contrairement aux autres types de référence, on peut même pas déréférencer un PhantomReference. Dans un sens, il n'a pas de point à la chose dont il points de, autant que les appelants peuvent le dire. Il permet simplement à l'un d'associer certaines données liées à l'objet référencé -- données qui peuvent ensuite être inspectées et traitées lorsque l' PhantomReference obtient en file d'attente dans ses ReferenceQueue. Normalement, on tire d'un type d' PhantomReference et contient d'autres données de ce type dérivé. Malheureusement, il y a un peu de passer participé à faire de l'utilisation d'un tel type dérivé.

Dans votre exemple de code, il n'est pas l' ref de référence (ou, si vous préférez, "variable") qui peut être null. Plutôt, c'est la valeur obtenue en appelant Reference#get() qui peut être null. Si elle est jugée nulle, vous êtes trop tard, l'objet référencé est déjà sur sa façon d'être recueillis:

final String val = ref.get();
if (null != val)
{
  // "val" is now pinned strongly.
}
else
{
  // "val" is already ready to be collected.
}

18voto

BalusC Points 498232

Ils sont expliqués en détail dans cet article et résumées comme suit:

Une référence faible, c'est tout simplement une référence qui n'est pas assez fort pour forcer un objet à rester en mémoire. La faiblesse des références vous permettent de tirer parti de la garbage collector de la capacité de déterminer l'accessibilité pour vous, donc vous n'avez pas à le faire vous-même.

Un soft de référence est exactement comme une référence faible, sauf qu'il est moins pressé de jeter de l'objet auquel il se réfère. Un objet qui n'est que faiblement accessible (les références les plus solides sont WeakReferences) sera rejeté lors de la prochaine collecte des ordures cycle, mais un objet qui est doucement accessible sera généralement rester dans les parages pendant un certain temps.

Un fantôme de référence est tout à fait différente de celle ou SoftReference ou WeakReference. Son emprise sur son objet est tellement mince qu'on ne peut même pas récupérer l'objet - get() méthode retourne toujours null. La seule utilisation de cette référence est de garder la trace de quand il obtient en file d'attente en ReferenceQueue, à ce point, vous savez que l'objet pour lequel elle a signalé qu'il est mort.


Pourquoi il n'y a pas d' SoftHashMap ou PhantomHashMap est probablement parce qu'il n'y a pas de monde réel de cas d'utilisation pour eux. Souvent une entité cache comme EHCache est recommandé au cours de cette. Cependant, dans la Goyave Collections vous pouvez utiliser MapMaker pour créer et/ou simuler un SoftHashMap.


Comme pour le code de l'exemple, l' ref ne sera jamais nulle. L' ref.get() cependant peut retourner la valeur null lorsque la référence de tenir est GC ed.


Voir aussi:

6voto

Un lien: http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html

PhantomHashMap ne fonctionnerait pas très bien en tant que get retourne toujours null pour le fantôme de références.

Les Caches sont difficiles, alors SoftHashMap peut ne pas fonctionner aussi bien que vous pourriez penser. Cependant, je crois que Google collection de la bibliothèque contient déjà une carte de référence de mise en œuvre.

Vous devriez toujours vérifier qu' get rendements non-null. (Remarque, qui ne vérifie pas que l' Reference de référence, elle, n'est-null.) Dans le cas de l'internement des chaînes qu'il le sera toujours, mais (comme toujours) n'essayez pas d'être "intelligent".

3voto

James L Points 11

Il doit également être mentionné, comme indiqué sur le commentaire par Truong Xuan Tinh, ici: http://blog.yohanliyanage.com/2010/10/ktjs-3-soft-weak-phantom-references/

Que JRockit JVM implémente faible/soft/fantôme références différemment de la JVM de Sun.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X