8.1 Referințe slabe în Java

Există mai multe tipuri de referințe în Java.

Există StrongReference - acestea sunt cele mai comune link-uri pe care le creăm în fiecare zi.

Object object = new Object();//created an object
object = null;//can now be garbage collected

Și există trei tipuri „speciale” de legături - SoftReference, WeakReference, PhantomReference. De fapt, există o singură diferență între toate tipurile de legături - comportamentul GC cu obiectele la care se referă. Vom discuta mai detaliat despre fiecare tip de link mai târziu, dar pentru moment, următoarele cunoștințe vor fi suficiente:

  • SoftReference este o referință soft, dacă GC vede că un obiect este accesibil doar printr-un lanț de referințe soft, atunci îl va șterge din memorie. Pot fi.
  • WeakReference - o referință slabă, dacă GC vede că un obiect este accesibil doar printr-un lanț de referințe slabe, atunci îl va elimina din memorie.
  • PhantomReference este o referință fantomă, dacă GC vede că un obiect este disponibil doar printr-un lanț de referințe fantomă, atunci îl va șterge din memorie. După mai multe rulări de GC.

De asemenea, puteți spune că tipurile de linkuri au un anumit grad de moale:

  • O legătură rigidă obișnuită este orice variabilă de tip referință. Nu este curățat de colectorul de gunoi înainte de a deveni nefolosit.
  • SoftReference . Obiectul nu va duce la epuizarea întregii memorie - este garantat că va fi șters înainte de apariția OutOfMemoryError. Poate mai devreme, în funcție de implementarea colectorului de gunoi.
  • Referință slabă . Mai slab moale. Nu împiedică eliminarea obiectului; colectorul de gunoi ignoră astfel de referințe.
  • PhantomReference . Folosit pentru procesarea „moartea” a unui obiect: obiectul este disponibil după finalizare până când este colectat gunoiul.

Dacă nu este încă clar care este diferența, atunci nu vă faceți griji, în curând totul va cădea la loc. Detaliile sunt în detalii, iar detaliile vor urma.

8.2 WeakReference și SoftReference în Java

În primul rând, să ne uităm la diferența dintre WeakReference și SoftReference în Java.

Pe scurt, colectorul de gunoi va elibera memoria unui obiect dacă doar referințe slabe indică spre el. Dacă obiectul este indicat de SoftReferences, atunci memoria este dealocată atunci când JVM-ul are nevoie urgentă de memorie.

Acest lucru oferă un avantaj clar pentru SoftReference față de referința puternică în anumite cazuri. De exemplu, SoftReference este folosită pentru a implementa o aplicație cache, așa că primul lucru pe care îl va face JVM-ul este să șterge obiectele la care indică doar SoftReferences.

WeakReference este excelent pentru stocarea metadatelor, cum ar fi stocarea unei referințe la un ClassLoader. Dacă nu este încărcată nicio clasă, atunci nu ar trebui să vă referiți la ClassLoader. Acesta este motivul pentru care WeakReference face posibil ca colectorul de gunoi să-și facă munca pe ClassLoader de îndată ce ultima referință puternică la acesta este eliminată.

Exemplu WeakReference în Java:

// some object
Student student = new Student();

// weak reference to it
WeakReference weakStudent = new WeakReference(student);

// now the Student object can be garbage collected
student = null;

Exemplu SoftReference în Java:

// some object
Student student = new Student();

// weak reference to it
SoftReference softStudent = new SoftReference(student)

// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;

8.3 PhantomReference în Java

Instanța PhantomReference este creată în același mod ca în exemplele WeakReference și SoftReference, dar este rar folosită.

Un PhantomReference poate fi colectat gunoi dacă obiectul nu are referințe puternice (Strong), slabe (WeakReference) sau soft (SoftReference).

Puteți crea un obiect de referință fantomă astfel:

PhantomReference myObjectRef = new PhantomReference(MyObject);

PhantomReference poate fi folosit în situațiile în care finalize() nu are sens. Acest tip de referință este diferit de alte tipuri deoarece nu este conceput pentru a accesa un obiect. Este un semnal că obiectul a fost deja finalizat și colectorul de gunoi este gata să-și recupereze memoria.

Pentru a face acest lucru, colectorul de gunoi îl plasează într-o ReferenceQueue specială pentru procesare ulterioară. ReferenceQueue este locul în care sunt plasate referințele la obiect pentru a elibera memoria.

Referințele fantomă sunt o modalitate sigură de a ști că un obiect a fost eliminat din memorie. De exemplu, luați în considerare o aplicație care se ocupă de imagini mari. Să presupunem că vrem să încărcăm o imagine în memorie atunci când aceasta este deja în memorie, care este gata pentru colectarea gunoiului. În acest caz, vrem să așteptăm ca colectorul de gunoi să distrugă vechea imagine înainte de a încărca noua imagine în memorie.

Aici PhantomReference este o alegere flexibilă și sigură. Referința la imaginea veche va fi transmisă ReferenceQueue după ce obiectul imagine vechi este distrus. Odată ce avem acest link, putem încărca noua imagine în memorie.

undefined
3
Опрос
Working with memory in Java,  18 уровень,  7 лекция
недоступен
Working with memory in Java
Working with memory in Java