Axlat yig'uvchining xatti-harakatlari (xotirani qayta tiklovchi)
Java dasturchisi xotira taqsimotini kuzatishi shart emas, chunki axlat yig'uvchi avtomatik ravishda xotirani boshqaradi. Garbage Collector Java Virtual Machine (JVM) tomonidan boshqariladi. Axlat yig'uvchi - bu vaqti-vaqti bilan ishlaydigan va endi kerak bo'lmagan ob'ektlar tomonidan ishlatiladigan xotirani bo'shatish uchun past ustuvor jarayon. Turli JVM-larda turli xil axlat yig'ish algoritmlari mavjud. Bir nechta algoritmlardan foydalaniladi, masalan: havolalarni hisoblash algoritmi yoki belgilash va qirqish algoritmlari.
Java-da axlat yig'uvchini ishga tushirish
JVM odatda bo'sh xotira kam bo'lganda axlat yig'uvchini boshqaradi. Ammo axlat yig'uvchining ishlashi har doim etarli bo'sh xotira bo'lishiga kafolat bermaydi. Qayta tiklashdan keyin ham xotira etarli bo'lmasa, JVM OutOfMemoryError istisnosini chiqaradi. E'tibor bering, JVM istisnolardan oldin kamida bir marta axlat yig'uvchini ishga tushirishi kerak. Siz axlat yig'uvchidan Java-da ishlashni so'rashingiz mumkin, ammo bu amalni majburlay olmaysiz.
Axlat yig'uvchini ishga tushirishni so'rang
So'rov yuborish uchun siz quyidagi usullardan biriga qo'ng'iroq qilishingiz mumkin:
System.gc()
Runtime.getRuntime().gc()
Axlat yig'uvchini ishlatish uchun yaroqlilik
Ob'ekt jonli oqim uchun mavjud bo'lmaganda utilizatsiya qilinishi kerak. Ob'ekt turli hollarda tasarruf qilinishi mumkin:
- Agar ob'ektga tegishli bo'lgan mos yozuvlar turidagi o'zgaruvchi "0" ga o'rnatilgan bo'lsa, agar unga boshqa havolalar bo'lmasa, ob'ektni utilizatsiya qilish kerak.
- Agar ob'ektga tegishli bo'lgan mos yozuvlar turidagi o'zgaruvchi boshqa ob'ektga murojaat qilish uchun yaratilgan bo'lsa, unga boshqa havolalar bo'lmasa, ob'ektni utilizatsiya qilish kerak.
- Usulda lokal ravishda yaratilgan ob'ektlar, agar ular ushbu usuldan eksport qilinmasa (ya'ni, qaytarilmasa yoki istisno sifatida tashlanmasa), usul chiqqanda o'chiriladi.
- Bir-biriga havola qilingan ob'ektlar, agar ularning hech biri jonli tarmoqda mavjud bo'lmasa, utilizatsiya qilinishi mumkin.
Keling, bir misolni ko'rib chiqaylik:
public class TestGC
{
public static void main(String [] args)
{
Object o1 = new Integer(3);
Object o2 = new String("Tutorial");
o1 = o2;
o2 = null;
}
}
Ushbu misolda
Integer
dastlab o1 ko'rsatkichi tomonidan havola qilingan ob'ekt (butun son) 3-satrdan keyin yo'q qilinishi mumkin, chunki o1 endi ob'ektga
String
(string) ishora qiladi. O2 null ga murojaat qilish uchun yaratilgan bo'lsa ham, ob'ekt
String
(satr) qayta ishlanmaydi, chunki o1 unga ishora qiladi.
Yakunlash
finalize()
Java texnologiyasi axlat yig'uvchi ob'ektni xotiradan olishdan oldin kerakli tozalashni amalga oshirish uchun usuldan foydalanish (yakunlash) imkonini beradi . Bu usul axlat yig'uvchi ob'ektga boshqa havolalar yo'qligini aniqlaganda axlat yig'uvchi tomonidan chaqiriladi. Bu sinfda tasvirlangan
Object
, ya'ni u barcha sinflar tomonidan meros qilib olinadi.
finalize()
Pastki sinf o'zini tizim resurslaridan ozod qilish yoki boshqa tozalash usulini bekor qiladi :
protected void finalize() throws Throwable
Agar ro'yxatdan o'tmagan istisno usuli tomonidan tashlangan bo'lsa
finalize()
, istisno e'tiborga olinmaydi va ushbu ob'ektni yakunlash to'xtatiladi. Usul
finalize()
ob'ektning ishlash muddati davomida faqat bir marta chaqiriladi.
finalize()
Har qanday ob'ektni utilizatsiya qilishdan himoya qilish uchun usulni qo'llash mumkin .
finalize()
Ammo bu holda, axlat yig'uvchi endi ushbu ob'ekt uchun faollashtirilmaydi . Ob'ekt axlat yig'ilishidan oldin usul
finalize()
har doim bir marta chaqiriladi.
finalize()
Shu bilan birga, ushbu ob'ekt uchun mavjud bo'lgan butun vaqt davomida usul faollashtirilmasligi mumkin , chunki u yo'q qilinishi mumkin emas.
Xulosa
Ushbu bo'limda biz Java tilida xotirani boshqarish texnikasi bo'lgan axlat yig'ish jarayonini ko'rib chiqdik. Axlat yig'ishni majburlab bo'lmaydi. Biz ob'ektlarni qayta ishlashga yaroqli qilishning turli usullari haqida bilib oldik va bu usul
finalize()
ob'ektni axlat yig'uvchi tomonidan qaytarib olinishidan oldin qo'llanilishini bilib oldik.
Mashq qilish
Savol: 7-qatordan keyin qancha ob'ektlar utilizatsiya qilinadi?
public class TutorialGC
{
public static void main(String [] args)
{
Object a = new Integer(100);
Object b = new Long(100);
Object c = new String("100");
a = null;
a = c;
c = b;
b = a;
}
}
Javob variantlari: A. 0 B. 1 C. 2 D. 3 E. Kodni tuzib boʻlmaydi
Toʻgʻri variant: B
Izoh: 1, 2 va 3-qatorlarda yaratilgan uchta obʼyektdan faqat obʼyekt
Integer
utilizatsiya qilinishi kerak. 7-satr oxiri. Dastlab ob'ektga havola qilingan o'zgaruvchan havolalar, a, 5-qatordagi
Integer
ob'ektga havola qiladi . Shunday qilib, ob'ekt 5-satrdan keyin utilizatsiya qilinishi kerak, chunki unga havola qiladigan o'zgaruvchilar yo'q. O'zgaruvchilar va 6 va 7-qatorlardagi ob'ektlar va ob'ektlarga murojaat qiling , shuning uchun ular qayta ishlanmaydi.
String
Integer
b
c
String
Long
GO TO FULL VERSION