Quelle est la différence entre SoftReference et WeakReference en Java?
Quelle est la différence entre java.lang.réf.WeakReference
et java.lang.réf.SoftReference
?
- SoftReferences sont un type d' (pas vraiment, mais pour la discussion du saké) WeakReferences qui sont habituellement recueillies lors de la JVM pense qu'il est à court de mémoire.
- Lâche faiblesse des refs sont toujours recueillies à chaque fois que le GC s'exécute. Voir stackoverflow.com/a/46291143/632951
Vous devez vous connecter pour publier un commentaire.
De La Compréhension Des Références Faibles, par Ethan Nicolas:
Et Peter Kessler ajouté dans un commentaire:
Références faibles sont collectées avec impatience. Si GC trouve qu'un objet est
faiblement accessible (accessible uniquement par le biais de références faibles), il va dégager la
la faiblesse des références à cet objet immédiatement. En tant que tels, ils sont bons pour
garder une référence à un objet pour lequel votre programme conserve également
(fortement référencé) "informations associées" quelque part, comme la mise en cache
la réflexion de l'information à propos d'une classe, ou un wrapper pour un objet, etc.
Tout ce qui n'a pas de sens de garder après l'objet auquel il est associé
avec GC-ed. Lorsque la référence faible est effacée, il obtient en file d'attente dans un
référence de la file d'attente de votre code sondages, quelque part, et il ignore l'
les objets associés ainsi. Qui est, vous gardez extra d'informations sur un
objet, mais que l'information n'est pas nécessaire une fois que l'objet qu'il désigne
s'en va. En fait, dans certaines situations, vous pouvez même sous-classe
WeakReference et de garder les associés de l'information supplémentaire à propos de l'objet
dans les domaines de la WeakReference sous-classe. Un autre exemple d'utilisation de
WeakReference est en conjonction avec des Cartes pour garder canonique instances.
SoftReferences d'autre part, sont bonnes pour la mise en cache externe, recreatable ressources
comme la GC généralement des retards de les effacer. Il est garanti bien que tous les
SoftReferences aurez effacé avant de OutOfMemoryError est levée, de sorte qu'ils
théoriquement, ne peut pas provoquer une OOME[*].
Cas d'utilisation typique exemple de garder un analysée forme d'un contenu à partir d'un
fichier. Vous auriez du mettre en place un système où vous chargez un fichier, l'analyser, et de garder
un SoftReference à la racine de l'objet de l'analyse de la représentation. La prochaine fois
vous avez besoin du fichier, vous allez essayer de le récupérer par la SoftReference. Si
vous pouvez le récupérer, vous vous épargner une autre charge/parse, et si le GC
effacé en attendant, vous le recharger. De cette façon, vous utiliser gratuit
mémoire pour l'optimisation des performances, mais ne prenez pas le risque d'une OOME.
Maintenant, pour le [*]. En gardant un SoftReference peut pas causer un OOME en lui-même. Si
d'autre part, par erreur, vous utilisez SoftReference pour une tâche d'une WeakReference est destiné
à être utilisé (à savoir, vous conservez les informations associées à un Objet en quelque sorte
fortement référencé, et le jeter lorsque l'objet de Référence obtient
désactivée), vous pouvez exécuter dans OOME que votre code qui interroge le ReferenceQueue
et supprime les objets associés peut arriver à ne pas s'exécuter dans un temps opportun
la mode.
Ainsi, la décision dépend de l'utilisation
- si vous êtes à la mise en cache de l'information qui est cher à construire, mais
néanmoins reconstructible à partir d'autres données, utiliser des références
- si vous êtes en gardant une référence à un exemple canonique de certaines données, ou
vous voulez avoir une référence à un objet sans être "propriétaire" (ce qui
la prévention de la GC avait), l'utilisation d'une référence faible.
WeakReference
est que dans les endroits où l'on devrait être en utilisant, le fait que l'on peut rester valide pour un peu de temps après la référence est hors de portée peut être tolérable, mais n'est pas souhaitable.WeakReference
qui est à observer GC s'exécute. Voir d'élaboration: stackoverflow.com/a/46291143/632951En Java; ordre de la plus forte à la plus faible, il y a: Forte, Douce, Faible et Phantom
Un référence Forte est normal de référence qui protège la visée de l'objet de collection GC. c'est à dire Jamais de collecte des ordures.
Un Doux de référence est admissible pour la collecte par le garbage collector, mais ne sera probablement pas recueilli, jusqu'à ce que sa mémoire n'est nécessaire. les ordures recueille avant de
OutOfMemoryError
.Un référence Faible est une référence qui ne protège pas référencé d'objet de collection GC. les ordures collecte dans le pas de Forte ou Douce refs.
Un Fantôme de référence est une référence à un objet est phantomly référencé après qu'il a été finalisé, mais avant sa mémoire allouée a été récupéré.
Source
Analogie: Assumer une JVM est un royaume, un Objet est un roi du royaume, et la GC est un attaquant de l'uni, qui tente de tuer le roi(objet).
until memory is available
ne fait pas de sens. Voulez-vous direis eligible for collection by garbage collector, but probably won't be collected until its memory is needed for another use
?Référence Faible
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ref/WeakReference.html
Principe:
weak reference
est liée à la collecte des déchets. Normalement, un objet ayant une ou plusieursreference
ne seront pas admissibles pour la collecte des ordures.Le principe ci-dessus n'est pas applicable lorsqu'il est
weak reference
. Si un objet n'a qu'faible référence à d'autres objets, puis de son prêt pour la collecte des ordures.Regardons l'exemple ci-dessous: Nous avons une
Map
avec des Objets où la Clé est de faire référence à un objet.Maintenant, lors de l'exécution du programme, nous avons fait
emp = null
. LeMap
en maintenant la touche n'a pas de sens ici, comme c'estnull
. Dans la situation ci-dessus, l'objet n'est pas de ces ordures.WeakHashMap
WeakHashMap
est celui où les entrées (key-to-value mappings
) sera supprimé quand il n'est plus possible de les récupérer à partir de laMap
.Permettez-moi de montrer l'exemple ci-dessus, même avec WeakHashMap
De sortie: a Pris
20 calls to System.gc()
entraîneraMap size
de : 0.WeakHashMap
a que de faibles références aux touches, pas de solides références à l'instar d'autresMap
classes. Il y a des situations qui vous devez prendre soin lors de la valeur ou de la clé est fortement référencé, si vous avez utiliséWeakHashMap
. Cela peut éviter par emballage de l'objet dans un WeakReference.Doux Références.
Soft Reference
est légèrement plus forte que la faiblesse de référence. Soft de référence permet pour la collecte des ordures, mais soulève le garbage collector pour effacer uniquement si il n'y a pas d'autre option.Le garbage collector n'est pas agressive recueillir doucement accessible objets de la manière qu'il le fait avec faiblement ceux qui sont accessibles -- au lieu de cela, il ne recueille doucement accessible objets si c'est vraiment "besoin" de la mémoire. Doux références sont une façon de dire que le garbage collector, "aussi longtemps Que la mémoire n'est pas trop serrée, j'aimerais garder cet objet autour de la. Mais si la mémoire devient vraiment serré, aller de l'avant et de les collecter et je vais y répondre." Le garbage collector est nécessaire pour effacer toutes les références avant de pouvoir lancer
OutOfMemoryError
.NullPointerException
dansaMap.get().put(...)
.WeakHashMap
exemple (puisque c'est la première qui démontre la Faiblesse de comportement). Regarde la doc pour "WeakHashMap":"An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use. "
L'ensemble du point de l'utilisation de WeakHashMap est que vous n'avez pas à déclarer/pass-dans un WeakReference; la WeakHashMap fait pour vous, en interne. docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.htmlWeakHashMap
en action, avec application exemple montrant comment les entrées sont supprimées que après garbage-collection exécute, voir ma Réponse pour la Question, Est WeakHashMap toujours croissante, ou faut-il vider la poubelle clés?.La seule vraie différence entre un soft de référence et une référence faible, c'est que
SoftReference
est conçu pour les caches. Lorsqu'il est constaté qu'unWeakReference
références d'un objet inaccessible, elle sera effacé immédiatement.SoftReference
peut être laissé tel qu'il est. Généralement, il existe un algorithme relatives à la quantité de mémoire disponible et l'heure de la dernière utilisation afin de déterminer si elle doit être effacée. Le courant de Soleil algorithme est d'effacer la référence si elle n'a pas été utilisé comme le nombre de secondes qu'il y a des méga-octets de mémoire libre sur le tas Java (configurable, serveur HotSpot les contrôles contre le maximum possible de segment défini par les-Xmx
).SoftReference
s seront supprimés avant deOutOfMemoryError
est levée, sauf si accessible.java.lang
. De tels abus de synonymes est en train de faire tout bon.Ce l'article peut être super utile pour comprendre la forte, douce, faible fantôme et de références.
Pour vous donner un résumé,
Si vous n'avez références faibles à un objet (pas de références fortes), alors l'objet sera remis en état par GC dans le très à côté GC cycle.
Si vous n'avez doux références à un objet (pas de références fortes), alors l'objet sera remis en état par GC uniquement lorsque la JVM est à court de mémoire.
Donc on peut dire que, forte de références ont pouvoir ultime (ne peut jamais être collectées par le GC)
Doux références sont puissant de références faibles (comme ils peuvent échapper à la GC cycle jusqu'à ce que la JVM est à court de mémoire)
Références faibles sont même moins puissant que les références (comme ils ne peuvent pas échapper à toute GC cycle et de remise en état, si l'objet n'avons pas d'autre référence forte).
Restaurant Analogie
Maintenant, si vous êtes un à la clientèle forte (analogue à une forte référence), alors, même si un nouveau client vient dans le restaurant ou quoi que ce soit happnes, vous ne quitterez jamais votre table (la zone de mémoire sur le tas). Le garçon n'a pas le droit de vous dire (ou même demander de vous) de quitter le restaurant.
Si vous êtes un doux client (analogue à la douce de référence), alors si un nouveau client vient dans le restaurant, le garçon ne va pas vous demander de quitter la table, à moins qu'il n'y a pas d'autre table vide à gauche pour accueillir le nouveau client. (En d'autres termes, le serveur vous demandera de quitter la table seulement si un nouveau client étapes et il n'y a pas d'autre tableau à gauche pour ce nouveau client)
Si vous êtes un faibles client (analogue à la faiblesse de la référence), puis maître d'hôtel, à son gré, à tout moment) vous demander de quitter le restaurant 😛
La Seule Vraie Différence
Par le doc, lâche WeakReferences doit être effacé par l'exécution d'un GC.
Par le doc, lâche SoftReferences doit être désactivée avant de OOM est levée.
C'est la seule vraie différence. Tout le reste ne fait pas partie du contrat. (Je pars du principe que les derniers documents sont contractuelles.)
SoftReferences sont utiles. La mémoire sensible caches utilisation SoftReferences, pas WeakReferences.
La seule bon utilisation de WeakReference est d'observer la GC exécuter. Pour ce faire, créez un nouveau WeakReference dont l'objet se met immédiatement hors de portée, puis essayer d'obtenir la valeur null de
weak_ref.get()
. Quand il estnull
, vous apprenez qu'entre cette durée, le GC a couru.Comme pour incorrect utilisation de WeakReference, la liste est sans fin:
moche hack pour mettre en œuvre la priorité-2 softreference de telle sorte que vous n'avez pas à écrire une, encore il ne fonctionne pas comme prévu, car le cache serait effacé sur chaque GC exécuter, même quand il n'y a de mémoire libre. Voir https://stackoverflow.com/a/3243242/632951 pour phails. (D'ailleurs, si vous avez besoin de plus de 2 niveaux de priorité de cache? Vous auriez dois encore avoir besoin d'une vraie bibliothèque pour elle.)
moche hack pour associer des données à un objet d'une classe existante, encore il crée une fuite de mémoire (OutOfMemoryError) lorsque votre GC décide de prendre une pause après votre weakreferences sont créés. En outre, il est au-delà de laid: Une meilleure approche est d'utiliser des n-uplets.
moche hack pour associer des données à un objet d'une classe existante, où la classe a le culot de faire elle-même non-subclassable, et est utilisé dans un fonction existante code dont vous avez besoin à appeler. Dans un tel cas, la bonne solution est de modifier la classe et de le rendre subclassable, ou de modifier la fonction et lui faire prendre une interface au lieu d'une classe, ou d'utiliser une autre fonction.
equals()
est juste l'identité de l'objet? Doux références sembler une perte là, car une fois qu'un objet clé est de ne plus fortement accessible, vous ne serez jamais regarder que la cartographie de nouveau.Les six types d'objet de l'accessibilité par les états à Java -
sont accessibles à partir de la racine par un ou plusieurs la faiblesse des objets de référence
Pour plus de détails: https://www.artima.com/insidejvm/ed2/gc16.html « effondrement
Il faut être conscient que faiblement objet référencé n'obtiendrez recueilli quand il ne dispose que de faibles référence(s). Si il a autant comme une référence forte, il n'est pas collectées n'importe comment beaucoup de références faibles qu'il possède.
WeakReference: les objets qui ne sont que faiblement référencés sont collectées à chaque cycle de GC (mineur ou complète).
SoftReference: lorsque les objets qui ne sont doucement référencés sont collectées dépend de:
-XX:SoftRefLRUPolicyMSPerMB=N drapeau (la valeur par défaut est de 1000, aka 1 seconde)
Quantité de mémoire libre dans le tas.
Exemple:
Alors l'objet dont la référence est donnée uniquement par SoftReference seront collectées que si la dernière fois où il a été accédé est supérieure à 10 secondes.
Pour donner une action à l'utilisation de la mémoire aspect, j'ai fait une expérience avec une Forte, Douce, Faible & Fantôme références sous une lourde charge avec des objets lourds en conservant jusqu'à la fin du programme. Puis surveiller l'utilisation du tas de & GC comportement. Ces mesures peuvent varier au cas par cas, mais il donne certainement de haut niveau de la compréhension. Ci-dessous sont les résultats.
Tas & GC Comportement sous charge lourde
Vous pouvez obtenir de plus dans la profondeur des graphiques, des statistiques, des observations pour cette expérience ici.