Jaki jest domyślny rozmiar stosu, czy może rosnąć, jak działa z garbage collection?

Rozumiem, że każdy wątek ma swój stack. Prymitywne typy i odniesienia są przechowywane na stosie, a żaden obiekt nie jest utrzymywany na stosie.

Moje pytania to:

  • ile może rosnąć stos? (jak z paramerami - Xms i -Xmx)
  • Czy możemy ograniczyć jego wzrost?
  • czy stos ma domyślną wartość minimalną i maksymalną?
  • jak działa garbage collection na stosie?
Author: Hearen, 2013-11-17

2 answers

Ile może urosnąć stos?

Możesz użyć opcji maszyny Wirtualnej o nazwie ss, aby dostosować maksymalny rozmiar stosu. Opcja maszyny Wirtualnej jest zwykle przekazywana za pomocą-X{option}. Możesz więc użyć java -Xss1M, aby ustawić maksymalny rozmiar stosu na 1M.

Każdy wątek ma co najmniej jeden stos. Niektóre maszyny wirtualne Java(JVM) umieszczają stos Javy(wywołania metod Javy) i stos natywny(wywołania metod natywnych w maszynie wirtualnej) w jeden stos i wykonują odwijanie stosu za pomocą macierzystej Ramki zarządzanej (Managed to Native Frame), znanej jako M2NFrame. Niektóre JVMs przechowywać dwa stosy oddzielnie. Xss ustawia rozmiar stosu Javy w większości przypadków.

Dla wielu JVMs, ustawiają różne domyślne wartości dla rozmiaru stosu na różnych platformach.

Czy możemy ograniczyć ten wzrost?

Gdy dojdzie do wywołania metody, na stosie tego wątku zostanie utworzona nowa ramka stosu. Stos będzie zawierał zmienne lokalne, parametry, adres zwrotny, itd. W języku java nigdy nie można umieścić obiektu na stosie, tylko odniesienie do obiektu może być przechowywane na stosie. Ponieważ tablica jest również obiektem w Javie, tablice nie są również przechowywane na stosie. Tak więc, jeśli zmniejszysz ilość lokalnych pierwotnych zmiennych, parametrów, grupując je w Obiekty, możesz zmniejszyć miejsce na stosie. W rzeczywistości fakt, że nie możemy jawnie umieścić obiektów na stosie Javy wpływa na wydajność pewnego czasu (brak pamięci podręcznej).

Czy stos ma domyślną wartość minimalną lub domyślną wartość maksymalną?

Jak już mówiłem, różne maszyny wirtualne są różne i mogą się zmieniać nad wersjami. Zobacz tutaj .

Jak działa garbage collection NA stack?

Garbage collections w Javie to gorący temat. Garbage collection ma na celu zbieranie nieosiągalnych obiektów w stercie . Więc to wymaga definicji " osiągalny.'Wszystko na stosie stanowi część odniesień do zestawu głównego w GC. Wszystko, co jest osiągalne z każdego stosu każdego wątku, powinno być uważane za live. Istnieje kilka innych odniesień do zestawu głównego, takich jak wątek obiekty i niektóre obiekty klasowe.

Jest to tylko bardzo niejasne użycie stosu na GC. Obecnie większość JVMs używa generacyjnego GC. ten artykuł zawiera krótkie wprowadzenie na temat Java GC. A ostatnio czytałem Bardzo dobry artykuł mówiący o GC na. net. GC na oracle jvm jest dość podobny, więc myślę, że to również może pomóc.

 94
Author: StarPinkER,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Jak mówisz, zmienne lokalne i referencje są przechowywane na stosie. Gdy metoda powraca, wskaźnik stosu jest po prostu przenoszony z powrotem do miejsca, w którym znajdował się przed uruchomieniem metody, tzn. wszystkie lokalne dane są "usuwane ze stosu". Dlatego na stosie nie ma potrzeby zbierania śmieci, co dzieje się tylko w stercie.

Aby odpowiedzieć na twoje konkretne pytania:

  • Zobacz to pytanie Jak zwiększyć rozmiar stosu.
  • możesz ograniczyć wzrost stosu przez:
    • grupowanie wielu zmiennych lokalnych w obiekcie: ten obiekt będzie przechowywany na stosie i tylko odniesienie będzie przechowywane na stosie
    • ogranicz liczbę zagnieżdżonych wywołań funkcji (zazwyczaj nie używając rekurencji)
  • dla systemu windows domyślny rozmiar stosu to 320k dla 32bit i 1024k dla 64bit, zobacz ten link .
 13
Author: Vincent van der Weele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:41