გააზიარეთ 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
}
}