Java-da Heap və Stack yaddaşı

Farida Fatali
4 min readDec 5, 2023

--

  • HeapStack proqramlaşdırma dillərinin runtime-da (icra zamanında) istifadə olunan 2 fərqli yaddaş sahəsidir. Bunlar proqramlaşdırma dillərindən asılı deyil.
  • Hər ikisinin mənası “yığın, qalaq, dəstə” olaraq tərcümə edilsə də, quruluşları fərqlidir.
  • Stack — sanki üst-üstə yığmaq mənasındadır, məsələn, kitabları, qabları üst-üstə yığırıq.
  • Heap isə üst-üstə sıra ilə deyil, daha çox ortaya atılmış, səpələnmiş şəkildə yığını ifadə edir.
  • Ona görə Stack daha kontrollu, nəzarətli bir şəkildədir, Heap-in isə nəzarəti daha çətindir.
  • JVM bu yaddaş sahələrini əməliyyat sistemindən alır. Onların böyüklüyü JVM-ə əlavə edilə bilər. Onların böyüklüyü JVM-in performansına təsir edir.

Heap

  • Heap — JVM tərəfindən obyekt yaratmaq, obyektləri tutmaq üçün istifadə olunan yaddaş sahəsidir. Obyektlər üst-üstə deyil, sanki yanbayan dayanırlar. Əvvəllər buna dinamik yaddaş (dynamic memory area) da deyirdilər. Heap, adətən, Stack yaddaşından daha böyükdür. Yaddaşdan, yaddaş sızıntısından söhbət getdiyi zaman əsasən, ilk ağla gələn Heap yaddaşıdır.

Stack

  • Stack — proqramda həmin an işləyən, aktiv olan metodlar üçün ayrılan yaddaş sahələrinin olduğu yerdir. Buna gör də bəzən “call stack” də deyilir.
  • Stack — “last-in, first-out” (LIFO) şəklində işləyir. Bu, çox bəsit şəkildə üst-üstə yığılma şəklidir. Məsələn, qabları üst-üstə yığırıq, bizə qab lazım olanda ən üstdə olanı götürürük. Yəni ilk götürdüyümüz qab — ən son qoyduğumuz, ən üstdəki qab olacaq. Buna görə ona “last-in, first-out” deyilir, yəni son gələn ilk gedir.

Məsələn, bu nümunədə sıra ilə 1, 2, 3, 4 və 5 daxil olmuşdular. Amma çıxanda isə sondan əvvələ doğru, yəni 5, 4, 3, 2 və 1 ardıcıllığı ilə çıxacaqlar.

  • Hər metodun özünün ayrı bir sahəsi var ki, onların hamısı Stack-də düzülür (main() metodundan başlayaraq). Hər metodun Stack-dəki yaddaş sahəsinə pəncərə yaxud çərçivə (frame) deyilir və onlar Stack-də üst-üstə açılır. Main metodunu çağırdığımız zaman öncə main açılır, sonra hansısa metod çağırdığımız zaman üzərinə həmin metod, sıra ilə hansı metodları çağırsaq, həmin sıra ilə də bir-birinin üstünə gəlirlər. Yeni metodlar çağırıldıqca üstdə yeni stack-lər açıla-açıla gedir.
  • Metodlar bitib öncəki metoda döndüyümüz zaman, yəni metodun işi bitib, onu çağıran metoda geri qayıdanda işini bitirən metod oradan çıxır, onun Stack-da açılan pəncərəsi də silinir. Məsələn, main() metodu print() metodunu çağırmışdı, print() metodu read() metodunu, read() metodunun içində write() metodu çağrılmışdı. Stack-da main()-dən başlayaraq, print(), read(), write() metodları açılır. Bağlananda da əvvəl write() metodunun işi bitdiyi üçün o bağlanır, sonra read(), sonra print(), sonda da main() metodunun işi bitir.
  • Bu şəkildə Stack-dəki pəncərələr açılma sırasının tərsi formasında da silinir. main() də bitdiyi zaman Stack-də heç nə qalmır və JVM bağlanır. Buna “call stack” deyilir.
  • Stack-dəki yaddaş pəncərələri hansı metodlar üçün açılmışdısa, o metodların parametrləri, yerli dəyişənləri və s. üçün yaddaş ehtiyaclarını qarşılayır, onları orada tutur.
  • Stack-dəki hər pəncərə (frame) bir metod üçündür, metodun içindəki yerli dəyişənləri tutan yaddaş sahəsidir. Ona görə yerli dəyişənlərə “stack variable” da deyilir.
  • Stack-in böyüklüyü — metod parametrləri, onların sayı, o metodda elan olunan yerli dəyişənlər və s.-nin, yəni yaddaş tələb edən şeylərin quruluşu və böyüklüyündən asılıdır.
  • Stack silinəndə içindəki bütün data da silinir. Stack silinibsə, metoddan çıxmışıq və bütün yerli dəyişənlər də silinib deməkdir.

Yerli / lokal dəyişənlər və Stack

Yerli dəyişənlərə bu adlar da verilir:

  • Stack variables (yığın dəyişənlər) — Çünki obyektlər Heap-də yaradılarkən, yerli dəyişənlər Stack-də yaradılır.
  • Automatic variables (avtomatik dəyişənlər) — İçində olduqları bloka hər dəfə girilərkən təkrar əmələ gəlirlər, əlçatan olurlar, blokdan çıxınca əlçatmaz olurlar.
  • Temporary variables (müvəqqəti dəyişənlər) — Ömürləri, içində olduqları blokun ömrü qədərdir. Amma obyekt dəyişənlərinin ömrü obyektin ömrü ilə təyin edilir, obyektin yaddaşda qaldığı müddətdir (Garbage Collector ilə yığılıncaya qədər). Amma müvəqqəti dəyişənlər yerli dəyişənlərdir, metoda girdin — gördün — çıxdın — və ömrü bitdi. Eyni metoda 2 dəfə girdiyimizdə, məsələn, a dəyişəni ilk girişimizdə 5 idi, onu 6 etdik və çıxdıq; bir daha gəlib onu yenə 5 etdik, bu zaman 6 yox olur. Buna görə ona müvəqqəti deyilir.

Primitiv dəyişənlər haqda bəzi məqamlar:

  • Primitiv bir dəyişən üzv dəyişəni (sinif yaxud obyekt dəyişəni) ola bilər. Yaddaş baxımından əgər üzv dəyişənlərdirsə, yəni ya sinif ya obyekt dəyişkənləridirsə, Heap-də yaradılırlar.
  • Bir metodun içində elan edilmiş yerli dəyişənlərdirsə, tipindən asılı olmayaraq, Stack-də yer alırlar.
  • Dəyişənin primitiv yaxud referans olması onun birbaşa harada olduğunu, yəni Heap yaxud Stack-də olduğunu bizə bildirmir. Proqramın içində necə istifadə edildiyi onun Heap-də yaxud Stack-də olduğunu bildirir.
  • Obyektin bir parçasıdırsa, obyekt dəyişənidirsə, Heap-dədir. Obyektin deyil, metodun parçasıdırsa, yerli dəyişəndirsə, tipindən asılı olmayaraq Stack yaddaşındadır.

--

--

Farida Fatali
Farida Fatali

Written by Farida Fatali

Researcher Blogger, SMM Specialist, Content Creator and someone who always works on herself.

No responses yet