8.1 Слаби препратки в Java

В Java има няколко вида препратки.

Има StrongReference - това са най-често срещаните връзки, които създаваме всеки ден.

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

И има три „специални“ типа връзки - SoftReference, WeakReference, PhantomReference. Всъщност има само една разлика между всички видове връзки - поведението на GC с обектите, към които препращат. Ще обсъдим спецификите на всеки тип връзка по-подробно по-късно, но засега ще са достатъчни следните знания:

  • SoftReference е мека препратка, ако GC види, че даден обект е достъпен само чрез верига от меки препратки, тогава той ще го премахне от паметта. Може би.
  • WeakReference - слаба препратка, ако GC види, че даден обект е достъпен само чрез верига от слаби препратки, тогава той ще го премахне от паметта.
  • PhantomReference е фантомна препратка, ако GC види, че даден обект е достъпен само чрез верига от фантомни препратки, тогава той ще го премахне от паметта. След няколко изпълнения на GC.

Можете също така да кажете, че типовете връзки имат известна степен на мекота:

  • Обикновена твърда връзка е всяка променлива от референтен тип. Не се почиства от събирача на отпадъци, преди да стане неизползван.
  • SoftReference . Обектът няма да доведе до изразходване на цялата памет - гарантирано е, че ще бъде изтрит, преди да възникне OutOfMemoryError. Може и по-рано, в зависимост от изпълнението на събирача на отпадъци.
  • WeakReference . По-слаба мека. Не пречи на обекта да бъде изхвърлен; събирачът на боклук игнорира подобни препратки.
  • PhantomReference . Използва се за обработка на "смърт" на обект: обектът е достъпен след финализиране, докато не бъде събран за боклук.

Ако все още не е ясно Howва е разликата, тогава не се притеснявайте, скоро всичко ще си дойде на мястото. Подробностите са в подробностите, а подробностите ще последват.

8.2 WeakReference и SoftReference в Java

Първо, нека да разгледаме разликата между WeakReference и SoftReference в Java.

Накратко, събирачът на отпадъци ще освободи паметта на обект, ако само слаби препратки сочат към него. Ако обектът е посочен от SoftReferences, тогава паметта се освобождава, когато JVM има остра нужда от памет.

Това дава определено предимство на SoftReference пред Strong reference в определени случаи. Например SoftReference се използва за внедряване на кеш на приложение, така че първото нещо, което JVM ще направи, е да изтрие обекти, към които сочат само SoftReferences.

WeakReference е страхотен за съхраняване на метаданни, като например съхраняване на препратка към ClassLoader. Ако не е зареден клас, тогава не трябва да се обръщате към ClassLoader. Ето защо WeakReference позволява на събирача на боклук да върши работата си върху ClassLoader веднага щом последната силна препратка към него бъде премахната.

Пример за WeakReference в 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;

Пример за SoftReference в 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 в Java

Екземплярът PhantomReference се създава по същия начин, Howто в примерите WeakReference и SoftReference, но се използва рядко.

PhantomReference може да бъде събран боклук, ако обектът няма силни (Strong), слаби (WeakReference) or меки (SoftReference) препратки.

Можете да създадете обект Phantom Reference по следния начин:

PhantomReference myObjectRef = new PhantomReference(MyObject);

PhantomReference може да се използва в ситуации, в които finalize() няма смисъл. Този референтен тип е различен от другите типове, защото не е предназначен за достъп до обект. Това е сигнал, че обектът вече е финализиран и събирачът на отпадъци е готов да си върне паметта.

За да направи това, събирачът на отпадъци го поставя в специална ReferenceQueue за по-нататъшна обработка. ReferenceQueue е мястото, където се поставят препратки към обекти за освобождаване на памет.

Фантомните препратки са безопасен начин да разберете, че даден обект е премахнат от паметта. Например, помислете за приложение, което работи с големи изображения. Да кажем, че искаме да заредим изображение в паметта, когато вече е в паметта, което е готово за събиране на боклук. В този случай искаме да изчакаме събирача на отпадъци да унищожи старото изображение, преди да заредим новото изображение в паметта.

Тук PhantomReference е гъвкав и безопасен избор. Препратката към старото изображение ще бъде предадена на ReferenceQueue, след като старият обект на изображението бъде унищожен. След като имаме тази връзка, можем да заредим новото изображение в паметта.

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