Sobes.tech
Middle

Java-յում ի՞նչ տեսակների հղումներ կան և ինչպիսի՞ն են նրանց առանձնահատկությունները։

sobes.tech AI

Պատասխան AI-ից

Java-յում կան երեք հիմնական հղումներ (հղման փոփոխականներ), որոնք տարբեր են մաքրման հավաքիչի վարքագծով:

  • Հզոր Հղում (Strong Reference)
  • Նուրբ Հղում (Soft Reference)
  • Ազատ Հղում (Weak Reference)
  • Ֆանտոմ Հղում (Phantom Reference)

Հզոր Հղում (Strong Reference)

Սա ամենատարածված հղում է։ Օբյեկտը, որի վրա ցույց է տալիս հզոր հղումը, չի կորչի մաքրման հավաքչի կողմից այնքան ժամանակ, քանի դեռ առնվազն մեկ հզոր հղում կա նրա վրա։

// Օբյեկտի ստեղծում և հզոր հղում նրա վրա
Object myObject = new Object(); 

Նուրբ Հղում (Soft Reference)

Նուրբ հղումը ցույց է տալիս օբյեկտին, որը կարող է կորչել մաքրման հավաքչի կողմից, եթե JVM-ը պահանջում է հիշողություն։ Միայն նուրբ հղումներով նշված օբյեկտները երաշխավորված չեն կորչելու, մինչև հիշողությունը ազատվի։ Օգտագործվում է հիմնականում կեշավորման համար։

import java.lang.ref.SoftReference;

// Օբյեկտի ստեղծում
Object data = new Object(); 
// Նուրբ հղում ստեղծում օբյեկտի վրա
SoftReference<Object> softRef = new SoftReference<>(data); 

// Օբյեկտը կարող է կորչել, եթե հիշողությունը քիչ է
// Եթե օբյեկտը չի կորչել, կարելի է ստանալ այն
Object retrievedData = softRef.get(); 

Ազատ Հղում (Weak Reference)

Ազատ հղումը ցույց է տալիս օբյեկտին, որը կարող է կորչել մաքրման հավաքչի կողմից ցանկացած պահի, եթե այլ հզոր հղումներ չեն մնացել։ Օգտագործվում է հիմնականում կեշավորման համար, որտեղ տարրերը կարող են հեռացվել հիշողության պակասի դեպքում։

import java.lang.ref.WeakReference;

// Օբյեկտի ստեղծում
Object cacheEntry = new Object(); 
// Ազատ հղում ստեղծում
WeakReference<Object> weakRef = new WeakReference<>(cacheEntry); 

// Օբյեկտը կարող է կորչել ցանկացած պահի
// Ստուգում, արդյոք օբյեկտը կորչել է
if (weakRef.get() == null) { 
    // Օբյեկտը կորչել է
}

Ֆանտոմ Հղում (Phantom Reference)

Ֆանտոմ հղումը օգտագործվում է ReferenceQueue-ի հետ՝ գործողություններ կատարելու համար նախքան օբյեկտը ամբողջությամբ հեռացվի հիշողությունից։ get() միշտ վերադարձնում է null։

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

// Հետևվող օբյեկտի ստեղծում
Object resource = new Object(); 
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>(); 
// Ֆանտոմ հղում ստեղծում և կապում այն հերթին
PhantomReference<Object> phantomRef = new PhantomReference<>(resource, referenceQueue); 

// Անհատական թելում կարելի է հետևել հերթին
// Երբ օբյեկտը պատրաստ է ամբողջական հեռացման, ֆանտոմ հղումը կհայտնվի հերթում

Հատկանիշներ և համեմատություններ:

Հղումի Տիպը Մաքրման հավաքիչ get()-ով օբյեկտ ստանալը Օգտագործում
Հզոր Հղում Ոչ Այո Սովորական օգտագործում
Նուրբ Հղում Կարող է մաքրվել Այո (եթե չի մաքրվել) Կեշավորում (երբ հիշողությունը քիչ է)
Սլաբ Հղում Կարող է մաքրվել Այո (եթե չի մաքրվել) Կեշավորում (եթե չկա հզոր հղում)
Ֆանտոմ Հղում Կարող է մաքրվել Չի (միշտ null) Ռեսուրսների մաքարում նախքան հեռացումը (առանց ReferenceQueue)