JavaRush /Java Blogu /Random-AZ /Java-da Zibil Toplayıcı
Diana
Səviyyə

Java-da Zibil Toplayıcı

Qrupda dərc edilmişdir

Zibil yığıcının davranış xətti (yaddaş bərpaçısı)

Java proqramçısının yaddaşın ayrılmasına nəzarət etməsinə ehtiyac yoxdur, çünki zibil toplayıcı yaddaşı avtomatik idarə edir. Zibil Toplayıcı Java Virtual Maşın (JVM) tərəfindən idarə olunur. Zibil kollektoru vaxtaşırı işləyən və artıq lazım olmayan obyektlərin istifadə etdiyi yaddaşı azad edən aşağı prioritetli prosesdir. Fərqli JVM-lərdə fərqli zibil toplama alqoritmləri var. İstifadə olunan bir neçə alqoritm var, məsələn: istinad sayma alqoritmi və ya işarələmə və kazıma alqoritmləri.Zibil yığılması - 1

Java-da zibil kollektorunu işə salmaq

JVM adətən boş yaddaş az olduqda zibil kollektorunu işə salır. Lakin zibil yığıcının işləməsi həmişə kifayət qədər boş yaddaşın olacağına zəmanət vermir. Bərpa olunduqdan sonra belə kifayət qədər yaddaş yoxdursa, JVM OutOfMemoryError istisnasını atır. Nəzərə alın ki, JVM istisna atmazdan əvvəl ən azı bir dəfə zibil kollektorunu işə salmalıdır. Siz zibil toplayıcıdan Java-da işləməsini tələb edə bilərsiniz, lakin bu hərəkəti məcbur edə bilməzsiniz.

Zibil kollektorunu işə salmağı tələb edin

Müraciət etmək üçün aşağıdakı üsullardan birinə zəng edə bilərsiniz:
System.gc()
Runtime.getRuntime().gc()

Zibil kollektorunu işə salmaq üçün uyğunluq

Obyekt artıq canlı yayım üçün əlçatan olmadıqda atılmalıdır. Obyekt müxtəlif hallarda sərəncam verilə bilər:
  • Əgər obyektə istinad edən istinad tipli dəyişən "0" olaraq təyin edilibsə, ona başqa istinadlar yoxdursa, obyekt xaric edilməlidir.
  • Əgər obyektə istinad edən istinad tipli dəyişən başqa obyektə istinad etmək üçün yaradılıbsa, ona başqa istinadlar yoxdursa, obyekt xaric edilməlidir.
  • Metodda lokal olaraq yaradılmış obyektlər, həmin metoddan ixrac edilmədikcə (yəni, geri qaytarılmadıqda və ya istisna olaraq atılmadıqda) metod çıxdıqda atılır.
  • Bir-birinə istinad edən obyektlər, əgər onlardan heç biri canlı başlıqda mövcud deyilsə, xaric edilə bilər.
Bir misala baxaq:
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
    }
  }
Bu misalda Integerilkin olaraq o1 göstəricisi ilə istinad edilən obyekt (tam ədəd) 3-cü sətirdən sonra silinə bilər, çünki o1 indi obyektə String(sətir) istinad edir. O2 sıfıra istinad etmək üçün yaradılsa da, Stringo1 ona istinad etdiyi üçün obyekt (sətir) təkrar emal edilə bilməz.

Yekunlaşdırma

finalize()Java texnologiyası zibil kollektoru yaddaşdan obyekti götürməzdən əvvəl lazımi təmizləməni aparmaq üçün metoddan istifadə etməyə (sonlandırmaq) imkan verir . Zibil kollektoru obyektə daha çox istinad olmadığını müəyyən etdikdə, bu üsul zibil kollektoru tərəfindən obyektə çağırılır. Bu, sinifdə təsvir edilmişdir Object, yəni bütün siniflər tərəfindən miras alınmışdır. finalize()Alt sinif özünü sistem resurslarından azad etmək və ya başqa təmizləmə üçün metodu ləğv edir :
protected void finalize() throws Throwable
Qeydiyyatdan keçməmiş istisna metodu ilə atılırsa finalize(), istisna nəzərə alınmır və həmin obyektin yekunlaşdırılması dayandırılır. Metod finalize()obyektin ömrü boyu yalnız bir dəfə çağırılacaq. finalize()Hər hansı bir obyekti utilizasiyadan qorumaq üçün bir üsuldan istifadə etmək mümkündür . finalize()Amma bu halda artıq bu obyekt üçün zibil kollektoru aktivləşdirilmir . Obyekt zibil yığılmazdan əvvəl metod finalize()həmişə bir dəfə çağırılacaq. finalize()Bununla belə, metodun müəyyən bir obyekt üçün mövcud olduğu bütün müddət ərzində aktivləşdirilməməsi mümkündür , çünki o, sərəncama götürülə bilməz.

Xülasə

Bu bölmədə Java dilində yaddaşın idarə edilməsi texnikası olan zibil toplama prosesinə baxdıq. Zibil yığımı məcbur edilə bilməz. Biz obyektləri təkrar emala yararlı hala gətirməyin müxtəlif yolları haqqında öyrəndik və öyrəndik ki, bu metod finalize()obyektin zibil yığan tərəfindən geri qaytarılmasından əvvəl işə salınır.

Məşq edin

Sual: 7-ci sətirdən sonra neçə obyekt sərəncama götürüləcək?
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
    }
  }
Cavab variantları: A. 0 B. 1 C. 2 D. 3 E. Kod tərtib oluna bilməz Düzgün variant: B İzahat: 1, 2 və 3-cü sətirlərdə yaradılmış üç obyektdən yalnız obyekti Integerutilizasiya etmək lazımdır. 7-ci sətrin sonu. Dəyişən istinadları, ilkin olaraq obyektə istinad edən a , 5-ci sətirdəki Integerobyektə istinad edir. Beləliklə, obyekt 5-ci sətirdən sonra silinməlidir, çünki ona istinad edən dəyişənlər yoxdur. Dəyişənlər və 6-cı və 7-ci sətirlərdəki obyektlərə və obyektlərə istinad edin , ona görə də onlar təkrar emal oluna bilməz.StringIntegerbcStringLong
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION