logo

Stos kontra sterta Java

na Jawie, zarządzanie pamięcią jest istotnym procesem. Jest zarządzany automatycznie przez Javę. JVM dzieli pamięć na dwie części: stos pamięć i pamięć sterty. Z punktu widzenia języka Java oba są ważnymi obszarami pamięci, ale oba są wykorzystywane do różnych celów. The główna różnica między pamięcią stosu a pamięcią sterty polega na tym, że stos służy do przechowywania kolejności wykonywania metod i zmiennych lokalnych, podczas gdy pamięć sterty przechowuje obiekty i wykorzystuje dynamiczną alokację i zwalnianie pamięci. W tej sekcji szczegółowo omówimy różnice między stosem a stertą.

Stos kontra sterta Java

Pamięć stosu

Pamięć stosu to przestrzeń fizyczna (w pamięci RAM) przydzielona każdemu wątkowi w czasie wykonywania. Jest tworzony podczas tworzenia wątku. Zarządzanie pamięcią na stosie odbywa się według kolejności LIFO (Last-In-First-Out), ponieważ jest dostępne globalnie. Przechowuje zmienne, odniesienia do obiektów i częściowe wyniki. Pamięć przydzielona do układania żyć do czasu powrotu funkcji. Jeśli nie ma miejsca na utworzenie nowych obiektów, wyrzucaBłąd java.lang.StackOverFlow. Zakres elementów jest ograniczony do ich wątków. The JVM tworzy oddzielny stos dla każdego wątku.

Pamięć sterty

Jest tworzony podczas uruchamiania maszyny JVM i używany przez aplikację tak długo, jak aplikacja działa. Przechowuje obiekty i klasy JRE. Ilekroć tworzymy obiekty, zajmują one miejsce w pamięci sterty, podczas gdy odniesienie do tego obiektu tworzy się na stosie. Nie ma żadnej kolejności, takiej jak stos. Dynamicznie obsługuje bloki pamięci. Oznacza to, że nie musimy ręcznie obsługiwać pamięci. Aby automatycznie zarządzać pamięcią, Jawa udostępnia moduł zbierający elementy bezużyteczne, który usuwa obiekty, które nie są już używane. Pamięć przydzielona do sterty jest aktywna do momentu zakończenia działania programu lub zwolnienia pamięci. Elementy są globalnie dostępne w aplikacji. Jest to wspólna przestrzeń pamięci współdzielona ze wszystkimi wątkami. Jeśli przestrzeń sterty jest pełna, wyrzucaBłąd java.lang.OutOfMemory. Pamięć sterty jest dalej podzielona na następujące obszary pamięci:

  • Młoda generacjA
  • Przestrzeń ocalałego
  • Stare pokolenie
  • Trwałe pokolenie
  • Pamięć podręczna kodu

Poniższy obraz przedstawia alokację pamięci stosu i miejsca na stercie.

Stos kontra sterta Java

Różnica między pamięcią stosu i sterty

Poniższa tabela podsumowuje wszystkie główne różnice między pamięcią stosu a przestrzenią na stercie.

Parametr Pamięć stosu Przestrzeń sterty
Aplikacja Przechowuje przedmioty, które mają bardzo krótką żywotność, takie jak metody, zmienne, I zmienne referencyjne obiektów. Przechowuje obiekty i środowisko wykonawcze Java ( JRE ) zajęcia.
Zamawianie Wynika to z LIFO zamówienie. Nie ma żadnej kolejności, ponieważ jest to dynamiczna alokacja pamięci i nie ma żadnego ustalonego wzorca alokacji i zwalniania bloków pamięci.
Elastyczność To jest nie elastyczny ponieważ nie możemy zmienić przydzielonej pamięci. To jest elastyczny ponieważ możemy zmienić przydzieloną pamięć.
Efektywność To ma szybciej dostęp, alokację i dealokację. To ma wolniej dostęp, alokację i dealokację.
Rozmiar pamięci To jest mniejszy W rozmiarze. To jest większy W rozmiarze.
Wykorzystane opcje Java Możemy zwiększyć rozmiar stosu, używając opcji JVM -Xss. Możemy zwiększyć lub zmniejszyć rozmiar pamięci sterty, używając opcji -Xmx i -Xms JVM.
Widoczność lub zakres Zmienne są widoczne tylko dla wątku właściciela. Jest widoczny dla wszystkich wątków.
Generacja Kosmosu Kiedy tworzony jest wątek, system operacyjny automatycznie przydziela stos. Aby utworzyć przestrzeń sterty dla aplikacji, język najpierw wywołuje system operacyjny w czasie wykonywania.
Dystrybucja Dla każdego obiektu tworzony jest osobny stos. Jest on udostępniany wszystkim wątkom.
Zrzuty wyjątków JVM rzuca Błąd java.lang.StackOverFlow jeśli rozmiar stosu jest większy niż limit. Aby uniknąć tego błędu, zwiększ rozmiar stosu. JVM rzuca Błąd java.lang.OutOfMemory jeśli JVM nie jest w stanie utworzyć nowej metody natywnej.
Alokacja/delokacja Odbywa się to automatycznie przez kompilator . Odbywa się to ręcznie przez programista .
Koszt Jego koszt wynosi mniej . Jego koszt wynosi więcej w porównaniu do stosu.
Realizacja Jego realizacja jest twardy . Jego realizacja jest łatwy .
Kolejność przydziału Alokacja pamięci jest ciągły . Pamięć przydzielona w losowy zamówienie.
Bezpieczeństwo nici Jest bezpieczny dla wątków, ponieważ każdy wątek ma swój własny stos. Nie jest bezpieczny dla wątków, dlatego wymagana jest odpowiednia synchronizacja kodu.