Sobes.tech
Middle

გააზიარეთ Android პროგრამების მუშაობის კონტექსტში ზარის სტეკი და ჰიპი.

sobes.tech AI

პასუხი AI-სგან

Stack çağırışları — bu, funksiyaların/metodların çağırışları ilə əlaqəli məlumatların müvəqqəti saxlanması üçün istifadə olunan yaddaş sahəsidir. Hər çağırış bir Stack Frame yaradır, hansı ki, aşağıdakıları ehtiva edir:

  • Yerli dəyişənlər.
  • Metodun arqumentləri.
  • Geri dönüş ünvanı.

Frame-lər LIFO (Last-In, First-Out) prinsipi ilə stack-ə əlavə olunur. Metod tamamlandıqda, onun frame-i stack-dən silinir.

Heap (yığım) — bu, obyektlərin dinamik ayrılması üçün istifadə olunan yaddaş sahəsidir. Obyektlər new operatoru ilə yaradılır və onlara istinadlar olduğu müddətcə yaşayır. Əgər istinadlar yoxdursa, onlar tullantı yığımı üçün namizəd olurlar.

Əsas fərqlər:

Xüsusiyyət Çağırış Stack-i Yığım
Ömür müddəti qısa (metod tamamlandıqda) uzun (istinadlar olarsa)
Yaddaş ayırma avtomatik dinamik (new)
Yaddaşın boşaldılması avtomatik (metod tamamlandıqda) tullantı yığımı
Ölçü məhdud, əvvəlcədən təyin olunmuş elastik, mövcud yaddaşdan asılıdır
Məlumat tipi primitiv tiplər, obyektlərə istinadlar obyektlər

Android-də, hər bir axın öz çağırış stack-inə malikdir, yığım isə bütün axınlar arasında bölüşdürülür. Stack-overflow (StackOverflowError) çox dərin rekursiya və ya çox sayda yerli dəyişənlərin yaradılması zamanı baş verir. Yığımda yaddaş çatışmazlığı (OutOfMemoryError) isə yaddaşda kifayət qədər boş yer olmadıqda baş verir.

// Stack və yığımın istifadəsinə nümunə

public class Example {
    private int instanceVariable; // obyektin bir hissəsi kimi yığımda yerləşir

    public void someMethod(int parameter) { // parameter — stack-də
        int localVariable = 10; // localVariable — stack-də

        // Obyekt yığımda yaradılır
        MyObject obj = new MyObject(); // obj (istinad) — stack-də, obyekt isə — yığımda

        obj.doSomething(localVariable); // localVariable yeni frame-in stack-ə dəyəri ilə ötürülür
    }

    private class MyObject {
        public void doSomething(int value) { // value — doSomething-in stack frame-də
            // Daxili metod, yeni frame əlavə edir
            anotherMethod();
        }
    }

    private void anotherMethod() {
        // Bu metod yeni frame yaradır
    }
}