Co to jest pamięć stosu?
Stos w java to sekcja pamięci, która zawiera metody, zmienne lokalne i zmienne referencyjne. Odwołania do pamięci stosu są zawsze dokonywane w kolejności Last-In-First-Out. W stosie tworzone są zmienne lokalne.
Co to jest pamięć sterty?
Sterta to sekcja pamięci, która zawiera obiekty i może również zawierać zmienne referencyjne. Zmienne instancji są tworzone w stercie
Alokacja pamięci w Javie
Alokacja pamięci w Javie to proces, w którym sekcje pamięci wirtualnej są odkładane w programie do przechowywania zmiennych oraz instancji struktur i klas. Jednak pamięć nie jest przydzielana do obiektu w deklaracji, ale tworzone jest tylko odwołanie. Do alokacji pamięci obiektu używana jest metoda new (), więc obiektowi jest zawsze przydzielana pamięć na stercie.
Przydział pamięci Java jest podzielony na następujące sekcje:
- Sterta
- Stos
- Kod
- Statyczny
Taki podział pamięci jest niezbędny do efektywnego zarządzania nią.
- Sekcja kodu zawiera kod bajtowy .
- Stos część pamięci zawiera metody, zmienne lokalne i zmienne referencyjne.
- Sekcja Sterta zawiera Obiekty (może również zawierać zmienne odniesienia).
- Sekcja Static zawiera statyczne dane / metody .
Różnica między zmienną lokalną a zmienną instancji
Zmienna instancji jest zadeklarowana wewnątrz klasy, ale nie wewnątrz metody
class Student{int num; // num is instance variablepublic void showData{}
Zmienna lokalna są zadeklarowane wewnątrz w sposobie tym metoda argumentów .
public void sum(int a){int x = int a + 3;// a , x are local variables;}
Różnica między stosem a stertą
Kliknij tutaj, jeśli wideo nie jest dostępne
Weźmy przykład, aby lepiej to zrozumieć.
Weź pod uwagę, że Twoja główna metoda wywołuje metodę m1
public void m1{int x=20}
W stosie java ramka zostanie utworzona za pomocą metody m1.
Zmienna X w m1 zostanie również utworzona w ramce dla m1 w stosie. (Zobacz zdjęcie poniżej).
Metoda m1 wywołuje metodę m2. W stosie java tworzona jest nowa ramka dla m2 na górze ramki m1.
Zmienne b i c zostaną również utworzone w ramce m2 w stosie.
public void m2(int b){boolean c;}
Ta sama metoda m2 wywołuje metodę m3. Ponownie na górze stosu tworzona jest ramka m3 (patrz ilustracja poniżej).
Powiedzmy teraz, że nasza metoda m3 tworzy obiekt dla klasy „Konto”, która ma zmienne dwóch instancji int p i int q.
Account {Int p;Int q;}
Oto kod metody m3
public void m3(){Account ref = new Account();// more code}
Wyciąg new Account () utworzy obiekt konta w stercie.
Zmienna referencyjna „ref” zostanie utworzona w java stosu.
Operator przypisania „=” utworzy zmienną referencyjną, która będzie wskazywać obiekt w stercie.
Po zakończeniu wykonywania metody. Przepływ kontroli powróci do metody wywołującej. Co w tym przypadku jest metodą m2.
Stos z metody m3 zostanie wypłukany.
Ponieważ zmienna referencyjna nie będzie już wskazywać na obiekt w stercie, będzie kwalifikować się do czyszczenia pamięci.
Gdy metoda m2 zakończyła swoje wykonanie. Zostanie wyskoczony ze stosu, a cała jego zmienna zostanie opróżniona i nie będzie już dostępna do użytku.
Podobnie dla metody m1.
Ostatecznie przepływ sterowania powróci do punktu początkowego programu. Która zwykle jest metodą „główną”.
Co się stanie, jeśli Object ma odwołanie jako zmienną instancji?
public static void main(String args[]) {A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
W tym przypadku zmienna referencyjna „child” zostanie utworzona w stercie, która z kolei będzie wskazywała na swój obiekt, podobnie jak na poniższym diagramie.
Podsumowanie:
- Gdy wywoływana jest metoda, na wierzchu stosu tworzona jest ramka.
- Po zakończeniu wykonywania metody przepływ sterowania wraca do metody wywołującej, a odpowiadająca jej ramka stosu jest opróżniana.
- W stosie tworzone są zmienne lokalne
- Zmienne instancji są tworzone w stercie i są częścią obiektu, do którego należą.
- W stosie tworzone są zmienne referencyjne.