JavaRush /Java blogi /Random-UZ /Java-da axlat yig'uvchi
Diana
Daraja

Java-da axlat yig'uvchi

Guruhda nashr etilgan

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.Chiqindilarni yig'ish - 1

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);               // Line 1
      Object o2 = new String("Tutorial");       // Line 2
      o1 = o2;                                  // Line 3
      o2 = null;                                // Line 4
      // Rest of the code here
    }
  }
Ushbu misolda Integerdastlab 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);  // Line1
      Object b = new Long(100);     // Line2
      Object c = new String("100"); // Line3
      a = null;                     // Line4
      a = c;                        // Line5
      c = b;                        // Line6
      b = a;                        // Line7
      // Rest of the code here
    }
  }
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 Integerutilizatsiya qilinishi kerak. 7-satr oxiri. Dastlab ob'ektga havola qilingan o'zgaruvchan havolalar, a, 5-qatordagi Integerob'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. StringIntegerbcStringLong
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION