Maison  >  Article  >  Java  >  Que sont les types de référence Java ?

Que sont les types de référence Java ?

青灯夜游
青灯夜游original
2020-07-25 11:52:256963parcourir

En Java, les types de référence incluent : 1. Référence forte (StrongReference) ; 2. Référence douce (SoftRefernce) ; 3. Référence faible (WeakReference) ;

Que sont les types de référence Java ?

Types de référence Java

Il existe généralement deux types de types Java, à savoir les types de données de base et les types de données de référence . Parmi eux, le type de données de référence fait référence à l'objet qui doit être référencé dans le tas de stockage. La référence est une fonctionnalité orientée objet Java.

À partir de JDK1.2, les types de référence en Java sont divisés en quatre types, à savoir :

①Strong Reference (StrongReference)

②SoftRefernce

③Weak Référence (WeakReference)

④Phantom Reference (PhantomReference)

Strong Reference-StrongReference

Ce type de référence est généralement celui le plus couramment utilisé en développement , tel que Stringstrong=newString("StrongReference"), lorsqu'un objet d'instance a une référence forte, le garbage collector ne recyclera pas l'objet. Lorsque la mémoire est insuffisante, il préfère lever une exception OutOfMemeryError plutôt que de recycler la référence forte. objet référencé, car la JVM pense que l'objet fortement référencé est l'objet utilisé par l'utilisateur, elle ne peut pas dire lequel doit être recyclé. Le recyclage forcé peut provoquer de graves erreurs dans le système.

Soft Reference-SoftReference

Si un objet n'a qu'une référence logicielle, la JVM recyclera l'objet uniquement lorsque la mémoire est insuffisante, et ne le recyclera pas dans d'autres cas. Les références logicielles peuvent être utilisées conjointement avec ReferenceQueue. Lorsque l'objet de la référence logicielle est recyclé en raison d'une mémoire système insuffisante, la JVM ajoute la référence logicielle à la ReferenceQueue associée.

ReferenceQueuereferenceQueue=newReferenceQueue();
SoftReference<Book>softReference=newSoftReference<>(newBook(),referenceQueue);
Bookbook=softReference.get();
Referencereference=referenceQueue.poll();

Lorsque la mémoire système est insuffisante, gc se déclenche, le Book sera recyclé, et la référence ne sera pas nulle.

Référence faible-WeakReference

Les objets avec uniquement des références faibles seront recyclés lorsque la JVM déclenchera gc. Contrairement aux références logicielles, les références faibles seront recyclées, que la mémoire soit insuffisante ou non. Les références faibles peuvent être utilisées conjointement avec ReferenceQueue. Lorsque le système déclenche gc et que l'objet de référence logiciel est recyclé, la JVM ajoute la référence faible à la ReferenceQueue associée. Cependant, la priorité du thread du garbage collector est donc très faible. les références faibles peuvent ne pas être recyclées rapidement. Ce qui suit est un exemple de déclenchement actif de gc pour vérifier cette conclusion.

ReferenceQueuereferenceQueue=newReferenceQueue();
WeakReference<Book>weakReference=newWeakReference(newBook(),referenceQueue);
Bookbook=softReference.get();
System.gc();
//Runtime.getRuntime().gc();
Referencereference=referenceQueue.poll();

Bien sûr, cela ne peut pas être reproduit à chaque fois, car nous appelons System.gc() juste pour dire à la JVM qu'il est temps de collecter les ordures, mais on ne sait pas exactement quand elle le fera. , mais d'après ce que j'ai testé, il semble que tant que vous écrivez System.gc() plusieurs fois de plus, la probabilité de récidive est toujours très élevée.

Référence virtuelle-PhantomReference

Si un objet n'a que des références fantômes qui y font référence, le garbage collector peut le recycler à tout moment. Les références fantômes sont principalement utilisées pour le suivi. l'activité d'un objet étant recyclé par le garbage collector, lors de son recyclage, la JVM ajoutera cette référence faible à la ReferenceQueue associée.

Contrairement aux références souples et aux références faibles, une référence virtuelle doit être associée à une ReferenceQueue. La valeur obtenue via phantomReference.get() est nulle. Imaginez s'il n'y a pas de ReferenceQueue associée. valeur de l'existence ?

PhantomReference<Book>phantomReference=newPhantomReference<>(newBook(),referenceQueue);
Bookbook=phantomReference.get();//此值为null
Referencereference=referenceQueue.poll();

Tutoriel recommandé : "tutoriel Java"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn