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) |