Javaда кайсы түрдүү шилтемелер бар жана алардын өзгөчөлүктөрү кандай?
sobes.tech AI
AIден жооп
Javaда, мурунку мусор чогултуучу менен иштөөдө айырмаланган үч негизги шилтеме ( шилтемелүү өзгөрмөлөр) бар:
- Күчтүү шилтеме (Strong Reference)
- Жумшак шилтеме (Soft Reference)
- Слаб шилтеме (Weak Reference)
- Фантом шилтеме (Phantom Reference)
Күчтүү шилтеме (Strong Reference)
Бул эң кеңири колдонулган шилтеме түрү. Күчтүү шилтемеге көрсөтүлгөн объект, кеминде бир күчтүү шилтеме бар болгондо, мусор чогултуучу тарабынан жыйналбайт.
// Объект түзүү жана ага күчтүү шилтеме түзүү
Object myObject = new Object();
Жумшак шилтеме (Soft Reference)
Жумшак шилтеме объектке көрсөтөт, ал мусор чогултуучу жады жетишсиз болсо жыйналышы мүмкүн. Жайында жумшак шилтемелер менен көрсөтүлгөн объекттер, жады жетишсиз болсо, жыйналбайт. Көбүнчө кэш үчүн колдонулат.
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);
// отделдүү жипте кезекти көзөмөлдөй аласыз
// Объект resource толук өчүрүлүүгө даяр болгондо, фантом шилтеме кезекке чыгат
Мүнөздөмөлөр жана салыштыруу:
| Шилтеме Түбү | Мусор чогултуучу | get() аркылуу объект алуу |
Колдонуу |
|---|---|---|---|
| Күчтүү шилтеме | Жок | Ооба | Адаттагы колдонуу |
| Жумшак шилтеме | Мүмкүн | Ооба (эгер жыйналган эмес болсо) | Кэш (жад жетишсиз болсо) |
| Слаб шилтеме | Мүмкүн | Ооба (эгер жыйналган эмес болсо) | Кэш (эгер күчтүү шилтемелер жок болсо) |
| Фантом шилтеме | Мүмкүн | Жок (ар дайым null) | Ресурстарды тазалоо үчүн, ReferenceQueue менен |