Opcja JVM -Xss - Co dokładnie robi?

229

Mówi się tutaj, że -Xss służy do „ustawiania rozmiaru stosu wątków”, co to dokładnie znaczy? Czy ktoś mógłby mi pomóc to zrozumieć?

instantsetsuna
źródło
Oto kilka przykładów (nie moje ...): herongyang.com/JVM/…
Christophe Roussy

Odpowiedzi:

269

Każdy wątek w aplikacji Java ma własny stos . Stos służy do przechowywania adresów zwrotnych, argumentów wywołania funkcji / metody itp. Więc jeśli wątek ma tendencję do przetwarzania dużych struktur za pomocą algorytmów rekurencyjnych, może potrzebować dużego stosu dla wszystkich tych adresów zwrotnych i tym podobnych. Dzięki Sun JVM możesz ustawić ten rozmiar za pomocą tego parametru.

TJ Crowder
źródło
11
Tak więc opcja -Xss jest używana do ograniczenia ilości pamięci zużywanej przez stos (przez przechowywanie adresów zwrotnych, zmiennych itp.), A która pośrednio ogranicza także głębokość stosu? Mam rację?
instantsetsuna
5
@instantsetsuna: Myślę, że bardziej powszechnym zastosowaniem jest prawdopodobnie zwiększenie domyślnego limitu. (Zawsze istnieje limit.) Ale tak, kontrolujesz rozmiar stosu, który kontroluje głębokość stosu.
TJ Crowder
Jak zrobić odpowiednik tego ustawienia XSS w kompilatorze Java (aka javac)? Jest to problem dla tych, którzy korzystają z bibliotek opartych na Scali, które powodują rekurencję dużych ogonów podczas kompilacji zajęć - Andrew Norman 9 sekund temu
Andrew Norman
@AndrewNorman: Nie kompilujesz opcji środowiska wykonawczego Java do pliku klasy, jest to bardziej zależne od środowiska. Jeśli naprawdę musisz to zrobić w kodzie, możesz napisać małą główną klasę, której jedynym zadaniem jest uruchomienie prawdziwej aplikacji z potrzebnymi opcjami.
TJ Crowder,
@AndrewNorman Możesz podać flagi konfiguracji JVM, które kompilator powinien uruchomić przy użyciu -Jflagskładni (np. -J-Xss).
francoisr
166

Rzeczywiście ustawia rozmiar stosu w JVM.

Powinieneś go dotknąć w jednej z tych dwóch sytuacji:

  • StackOverflowError (rozmiar stosu jest większy niż limit), zwiększ wartość
  • OutOfMemoryError: nie można utworzyć nowego wątku macierzystego (zbyt wiele wątków, każdy wątek ma duży stos), zmniejsz go.

Ten drugi zwykle pojawia się, gdy twój Xss jest ustawiony na zbyt duży - wtedy musisz go zrównoważyć (testowanie!)

Adam Adamaszek
źródło
3
Niekoniecznie za każdym razem. Zarówno SOE, jak i OOME mogą wystąpić z różnych powodów, które należy naprawić inaczej.
noego
4
To prawda, ale nie powiedziałem, że -Xss jest jedyną przyczyną SOE i OOME, ale na odwrót - jeśli zostanie nieprawidłowo ustawiony, może powodować jedną z dwóch przyczyn.
Adam Adamaszek
5

Każdy wątek ma stos, który służył do zmiennych lokalnych i wartości wewnętrznych. Rozmiar stosu ogranicza głębokość połączeń. Zasadniczo nie trzeba tego zmieniać.

Peter Lawrey
źródło
4

Jeśli się nie mylę, to mówi JVM, ile kolejnych wywołań przyjmie przed wydaniem StackOverflowError. Nie jest to coś, co ogólnie chcesz zmienić.

Kellindil
źródło