JVM-Option -Xss - Was macht es genau?

229

Hier steht , dass -Xss zum "Festlegen der Thread-Stapelgröße" verwendet wird. Was bedeutet das genau? Könnte mir jemand helfen, das zu verstehen?

instantsetsuna
quelle
Einige Beispiele hier (nicht meine ...): herongyang.com/JVM/…
Christophe Roussy

Antworten:

269

Jeder Thread in einer Java-Anwendung hat einen eigenen Stapel . Der Stapel wird verwendet, um Rücksprungadressen, Funktions- / Methodenaufrufargumente usw. zu speichern. Wenn ein Thread also dazu neigt, große Strukturen über rekursive Algorithmen zu verarbeiten, benötigt er möglicherweise einen großen Stapel für alle diese Rücksprungadressen und dergleichen. Mit der Sun JVM können Sie diese Größe über diesen Parameter einstellen.

TJ Crowder
quelle
11
Die Option -Xss wird also verwendet, um den Speicherbedarf eines Stapels zu begrenzen (durch Speichern von Rücksprungadressen, Variablen usw.) und um indirekt zu begrenzen, wie tief ein Stapel werden kann. Hab ich recht?
Instantsetsuna
5
@instantsetsuna: Ich denke, die häufigste Verwendung ist wahrscheinlich, das Standardlimit zu erhöhen . (Es gibt immer ein Limit.) Aber ja, Sie steuern die Größe des Stapels, wodurch gesteuert wird, wie tief der Stapel werden kann.
TJ Crowder
Wie macht man das Äquivalent dieser XSS-Einstellung auf dem Java-Compiler (auch bekannt als Javac)? Es ist ein Problem für diejenigen, die Scala-basierte Bibliotheken verwenden, die eine große Schwanzrekursion bei der Zusammenstellung der Klassen verursachen - Andrew Norman vor 9 Sekunden
Andrew Norman
@ AndrewNorman: Sie kompilieren keine Java-Laufzeitoptionen in die Klassendatei, das ist eher eine umgebungsspezifische Sache. Wenn Sie dies wirklich im Code tun müssen, können Sie eine winzige Hauptklasse schreiben, deren einzige Aufgabe darin besteht, Ihre echte Anwendung mit den von Ihnen benötigten Optionen zu starten.
TJ Crowder
@AndrewNorman Sie können JVM-Konfigurationsflags geben, mit denen der Compiler mithilfe der -JflagSyntax (z. B. -J-Xss) ausgeführt werden soll.
Francoisr
166

Es legt tatsächlich die Stapelgröße auf einer JVM fest.

Sie sollten es in einer dieser beiden Situationen berühren:

  • StackOverflowError (die Stapelgröße ist größer als das Limit), erhöhen Sie den Wert
  • OutOfMemoryError: Es kann kein neuer nativer Thread erstellt werden (zu viele Threads, jeder Thread hat einen großen Stapel). Verringern Sie ihn.

Letzteres tritt normalerweise auf, wenn Ihr Xss zu groß eingestellt ist - dann müssen Sie es ausgleichen (Testen!)

Adam Adamaszek
quelle
3
Eigentlich nicht unbedingt jedes Mal. Sowohl SOE als auch OOME können aus verschiedenen Gründen auftreten, die unterschiedlich behoben werden sollten.
Noego
4
Stimmt, aber ich habe nicht gesagt, dass -Xss die einzige Ursache für SOE und OOME ist, aber umgekehrt - wenn es falsch eingestellt ist, kann es eine der beiden Ursachen haben.
Adam Adamaszek
5

Jeder Thread hat einen Stapel, der für lokale Variablen und interne Werte verwendet wird. Die Stapelgröße begrenzt, wie tief Ihre Anrufe sein können. Im Allgemeinen müssen Sie dies nicht ändern.

Peter Lawrey
quelle
4

Wenn ich mich nicht irre, teilt dies der JVM mit, wie viele aufeinanderfolgende Aufrufe sie annehmen wird, bevor ein StackOverflowError ausgegeben wird. Nicht etwas, das Sie allgemein ändern möchten.

Kellindil
quelle