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.
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);
Object o2 = new String("Tutorial");
o1 = o2;
o2 = null;
}
}
Bu misalda
Integer
ilkin 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,
String
o1 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);
Object b = new Long(100);
Object c = new String("100");
a = null;
a = c;
c = b;
b = a;
}
}
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
Integer
utilizasiya 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
Integer
obyektə 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.
String
Integer
b
c
String
Long
GO TO FULL VERSION