Si un objet en mémoire n'a aucune référence, cela signifie que l'objet n'est plus utilisé et qu'il peut devenir candidat à la collecte des ordures. Cependant, comme le temps d'exécution du collecteur des ordures est incertain, le temps de recyclage réel des objets qui peuvent être collectés des ordures est incertain. Pour un objet, tant qu'il y a une référence, il existera toujours en mémoire. S'il y a de plus en plus d'objets comme celui-ci, dépassant la mémoire totale dans le JVM, le JVM lancera une erreur d'overfMemory. Bien que le fonctionnement spécifique de la collecte des ordures soit contrôlé par le JVM, les développeurs peuvent toujours interagir avec le collecteur des ordures dans une certaine mesure, et le but est de mieux aider le collecteur des ordures à gérer la mémoire de l'application. Cette méthode d'interaction consiste à utiliser le package java.lang.ref introduit par JDK 1.2.
1 Citation forte
Les citations fortes sont les citations les plus courantes utilisées. Si un objet a une forte référence, le collecteur des ordures ne le recyclera jamais. Lorsque l'espace mémoire est insuffisant, la machine virtuelle Java préfère lancer une erreur d'OutofMemoryError pour que le programme se termine anormalement et ne recyclait pas les objets avec de fortes références pour résoudre le problème de la mémoire insuffisante.
Par exemple, date de date = new Date (), la date est une référence forte à un objet. Des références solides aux objets peuvent être transmises partout dans le programme. Dans de nombreux cas, plusieurs références indiqueront le même objet en même temps. L'existence de références fortes limite le temps de survie d'un objet en mémoire. Si l'objet A contient une forte référence à l'objet B, alors en général, le temps de survie de l'objet B ne sera pas plus court que l'objet A. Si l'objet A ne définit pas explicitement la référence de l'objet B sur NULL, seulement après que l'objet a est collecté par l'objet de l'objet B n'a plus de référence.
Exemple de code:
package com.skywang.java; classe publique StrongReferenceTest {public static void main (String [] args) {mydate date = new mydate (); System.gc (); }} Résultats en cours:
<Non sortie>
Le résultat montre que même si la collecte des ordures est explicitement appelée, c'est une référence forte pour la date et que la date n'est pas recyclée.
En plus des références solides, le package java.lang.ref fournit différentes méthodes de référence à un objet. Le collectionneur d'ordures de JVM a différentes façons de gérer différents types de références.
2 citations douces
Si un objet n'a que des références douces, l'espace mémoire est suffisant et le collecteur des ordures ne le recyclera pas; Si l'espace mémoire est insuffisant, la mémoire de ces objets sera recyclée. Tant que le collecteur des ordures ne le recyclique pas, l'objet peut être utilisé par le programme. Des références souples peuvent être utilisées pour implémenter les caches sensibles à la mémoire.
Une référence douce peut être utilisée en conjonction avec une file d'attente de référence (ReferenceQueue). Si l'objet référencé par la référence douce est recyclé par le collecteur de déchets, la machine virtuelle Java ajoutera la référence douce à la file d'attente de référence associée.
Les références douces sont plus faibles que de fortes références en force et sont représentées par une conférence. Sa fonction est de dire au collecteur des ordures quels objets du programme sont moins importants et peuvent être temporairement recyclés en cas de mémoire insuffisante. En cas de mémoire insuffisante dans le JVM, le collecteur des ordures sera libre d'objets qui ne sont pointés que par des références douces. Si tous ces objets sont libérés et que la mémoire est insuffisante, une erreur d'OutofMemory sera lancée. Les références douces sont idéales pour créer des caches. Lorsque le système est insuffisant, le contenu dans le cache peut être libéré. Par exemple, considérez un programme d'éditeur d'image. Le programme lira tous les contenus du fichier image en mémoire pour un traitement facile. Les utilisateurs peuvent également ouvrir plusieurs fichiers en même temps. Lorsqu'il y a trop de fichiers ouverts en même temps, cela peut provoquer une mémoire insuffisante. Si des références souples sont utilisées pour pointer le contenu du fichier image, le collecteur des ordures peut récupérer cette mémoire si nécessaire.
Exemple de code:
package com.skywang.java; import java.lang.ref.softreference; public class softreferencest {public static void main (string [] args) {softreference ref = new softreference (new mydate ()); Référentiel.DrainMemory (); }} Résultats en cours:
<Non sortie>
Résultats: Lorsque la mémoire est insuffisante, la référence douce est terminée. Lorsque les références douces sont interdites,
Softreference Ref = new Softreference (new MyDate ()); RefortEstEst.DrainMemory ();
Équivalent à
MyDate Date = new MyDate (); // Il appartient au JVM d'exécuter if (jvm.insufficient memory ()) {date = null; System.gc ();} 3 citations faibles
Une référence faible est plus faible que la référence douce en force et est exprimée par la classe de référence faible. Son objectif est de se référer à un objet, mais il n'empêche pas l'objet d'être recyclé. Si une forte référence est utilisée, tant que la référence existe, l'objet référencé ne peut pas être recyclé. Les citations faibles n'ont pas ce problème. Lorsque le collecteur des ordures est en cours d'exécution, si toutes les références à un objet sont des références faibles, l'objet sera recyclé. La fonction des références faibles est de résoudre la relation de couplage entre les objets en temps de survie apportés par de fortes références. L'utilisation la plus courante des références faibles est dans les classes de collecte, en particulier dans les tables de hachage. L'interface de table de hachage permet à tout objet Java d'être utilisé comme clé. Lorsqu'une paire de valeurs de clé est mise dans la table de hachage, l'objet de table de hachage lui-même a une référence à ces objets de clé et de valeur. Si cette référence est une référence forte, tant que l'objet de table de hachage lui-même est toujours vivant, les objets de clé et de valeur contenus ne seront pas recyclés. Si une table de hachage avec un long temps de survie contient de nombreuses paires de valeurs clés, elle peut éventuellement consommer toute la mémoire dans le JVM.
La solution à cette situation consiste à utiliser des références faibles pour référence à ces objets afin que les objets de clé et de valeur dans la table de hachage puissent être collectés à la poubelle. Lowerhashmap est fourni en Java pour répondre à ce besoin commun.
Exemple de code:
package com.skywang.java; import java.lang.ref.weakReference; public class webreferenceTest {public static void main (string [] args) {faible référence ref = new faible (new mydate ()); System.gc (); }} Résultats en cours:
OBJ [Date: 1372142034360] est GC
Résultats: Lorsque la collection JVM Garbage fonctionne, des références faibles sont terminées.
FaibleReference Ref = new LowerReference (new MyDate ()); System.gc ();
Équivalent à:
MyDate Date = new MyDate (); // Collection Garbage if (jvm.InSufficient Memory ()) {Date = null; System.gc ();} La différence entre les références faibles et les références douces est que les objets avec seulement des références faibles ont un cycle de vie plus court. Au cours du processus d'un filetage de collecteur de déchets scannant la zone de mémoire sous sa juridiction, une fois qu'un objet avec seulement des références faibles est trouvé, sa mémoire sera recyclée, que l'espace mémoire actuel soit suffisant ou non. Cependant, comme le collecteur des ordures est un fil avec une priorité très faible, il ne peut pas nécessairement être découvert très rapidement pour les objets qui n'ont que de faibles références.
Une référence faible peut être utilisée en conjonction avec une file d'attente de référence (ReferenceQueue). Si l'objet référencé par une référence faible est collecté aux ordures, la machine virtuelle Java ajoutera la référence faible à la file d'attente de référence associée.
4 citations d'illusion
Également connu sous le nom de citations fantômes ~ Avant d'introduire des citations fantômes, nous devons d'abord introduire le mécanisme de terminaison de l'objet fourni par Java. Il existe une méthode finalisée dans la classe d'objets. L'intention originale de sa conception est d'effectuer un travail de nettoyage avant qu'un objet ne soit réellement recyclé. Parce que Java ne fournit pas de mécanisme similaire au destructeur C ++, il est implémenté par la méthode finalisée. Mais le problème est que le temps d'exécution du collecteur des ordures n'est pas fixé, donc le temps d'exécution réel de ces travaux de nettoyage ne peut pas être prédit. Une référence fantôme peut résoudre ce problème. Lors de la création d'un fantomréférence de référence fantôme, vous devez spécifier une file d'attente de référence. Lorsque la méthode finalisée d'un objet a été appelée, la référence fantôme de l'objet sera ajoutée à la file d'attente. En vérifiant le contenu dans la file d'attente, vous saurez si un objet est prêt à être recyclé.
L'utilisation de références fantômes et de leurs files d'attente est rare et est principalement utilisée pour implémenter un contrôle d'utilisation de la mémoire relativement fin, qui est très significative pour les appareils mobiles. Le programme peut demander la mémoire pour créer un nouvel objet après avoir déterminé qu'un objet doit être recyclé. De cette façon, la mémoire consommée par le programme peut être maintenue à un montant relativement faible.
Par exemple, le code suivant donne un exemple de l'implémentation d'un tampon.
classe publique Phantombuffer {octet privé [] data = new octet [0]; Private Referenceeue <Byte []> queue = new ReferenceQueue <Byte []> (); Phantomreference privé <byte []> ref = new PhantomReference <Byte []> (données, file d'attente); octet public [] get (int size) {if (size <= 0) {lancez new illégalArgumentException ("Mauvaise taille de tampon"); } if (data.length <size) {data = null; System.gc (); // Force Run the Gars Collector Try {Queue.Remove (); // Cette méthode bloquera jusqu'à ce que la file d'attente soit non vide ref.Clear (); // La référence fantôme ne sera pas automatiquement effacée, vous devez exécuter Ref = null; data = nouveau octet [taille]; ref = new PhantomReference <Byte []> (données, file d'attente); } catch (InterruptedException e) {e.printStackTrace (); }} return data; }} Dans le code ci-dessus, chaque fois qu'un nouveau tampon est appliqué, il est d'abord assuré que le réseau d'octets du tampon précédent a été recyclé avec succès. La méthode de suppression qui fait référence à la file d'attente bloque jusqu'à ce qu'une nouvelle référence fantôme soit ajoutée à la file d'attente. Cependant, il convient de noter que cette approche entraînera trop de fois le collecteur des ordures, ce qui peut entraîner un débit trop bas.
Exemple de code:
package com.skywang.java; import java.lang.ref.referenceeue; import java.lang.ref.phantomreference; public class PhantomReferentest {public static void main (String [] args) {ReferenceQueue Queue = new Referenceeue (); Phantomreference Ref = new Phantomreference (new MyDate (), file d'attente); System.gc (); }} Résultats en cours:
OBJ [Date: 1372142282558] est GC
Le résultat montre que la référence illusion est résiliée après l'instanciation.
ReferenceQueue Queue = new Referenceeue (); PhantomReference Ref = new PhantomReference (new MyDate (), file d'attente); System.gc ();
Équivalent à:
MyDate Date = new MyDate (); date = null;