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ą.
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.
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. |