Was genau macht -XX:-TieredCompilation?

Lesezeit: 4 Minuten

Benutzer-Avatar
Dr. Markus Weninger

Verwenden java -XX:+PrintFlagsFinal ich fand die TieredCompilation Flagge, und ich habe online ein bisschen darüber gelesen.

Trotzdem weiß ich es immer noch nicht exakt was passiert wenn man es einstellt false.

Ich weiß, dass das Kompilierungssystem 5 Ausführungsebenen unterstützt, die im Wesentlichen in Interpreter, C1 und C2 unterteilt sind:

  • Stufe 0 – Dolmetscher
  • Level 1 – C1 mit vollständiger Optimierung (kein Profiling)
  • Ebene 2 – C1 mit Aufruf- und Backedge-Zählern
  • Stufe 3 – C1 mit vollständiger Profilierung (Stufe 2 + MDO)
  • Stufe 4 – C2

Quelle: http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34

Zwei Fragen:

(1) Durch Einstellung -XX:-TieredCompilation, sind einige dieser Ebenen einfach deaktiviert? Wenn ja, welche?

(2) Gibt es ein Flag, um zu entscheiden, ob C1 oder C2 deaktiviert oder überhaupt nicht kompiliert werden soll?

Benutzer-Avatar
angin

-XX:-TieredCompilation deaktiviert die Kompilierungszwischenebenen (1, 2, 3), sodass eine Methode entweder interpretiert oder auf der maximalen Optimierungsebene (C2) kompiliert wird.

Als Nebenwirkung TieredCompilation Das Flag ändert auch die Anzahl der Compiler-Threads, die Kompilierungsrichtlinie und die Standardgröße des Code-Cache. Beachte das mit TieredCompilation deaktiviert

  • es wird weniger Compiler-Threads geben;
  • Anstelle der erweiterten Kompilierungsrichtlinie wird eine einfache Kompilierungsrichtlinie (basierend auf Methodenaufruf- und Backedge-Zählern) ausgewählt.
  • die Standardgröße des reservierten Code-Cache ist 5 mal kleiner.

Um den C2-Compiler zu deaktivieren und nur C1 ohne zusätzlichen Overhead zu belassen, set -XX:TieredStopAtLevel=1.

Um alle JIT-Compiler zu deaktivieren und alles im Interpreter auszuführen, verwenden Sie -Xint.

  • Vielen Dank! Jetzt bin ich etwas verwirrt, weil ich unterschiedliche Antworten habe: Wird eingestellt -XX:-TieredCompilation Jetzt (1.) C1 deaktivieren und immer bis zum Maximum kompilieren (C2) oder (2.) die JVM dazu bringen, heuristisch zu entscheiden, welche Kompilierungsebenen basierend auf der CPU deaktiviert werden sollen (wie von @AlBlue angegeben)? Es macht es mir auch schwer zu entscheiden, was ich als richtige Antwort akzeptieren soll 😛

    – Dr. Markus Weninger

    2. August 2016 um 13:42 Uhr


  • @MarkusWeninger Ich habe unter AlBlues Antwort kommentiert. Es ist nicht sehr genau.

    – angin

    2. August 2016 um 13:43 Uhr

  • Danke, ich habe es gerade gesehen. Im zweiten Kommentar, den Sie erwähnen TierXCompileThreshold und -XX:CompilationPolicyChoice=2, zwei neue Dinge, von denen ich noch nichts weiß, aber ich werde darüber lesen. 😛 Aber der erste Kommentar erklärt meine Frage sehr gut.

    – Dr. Markus Weninger

    2. August 2016 um 13:49 Uhr


Wie Sie bemerkt haben, gibt es verschiedene Ebenen von JIT (einschließlich des Verzichts auf JIT).

In älteren Java-Versionen mussten Sie diese zunächst auswählen (z -Xint, -client, -server), um nur mit dem Interpreter, nur mit dem Client-Compiler (C1) oder nur mit dem Server-Compiler (C2) ausgeführt zu werden.

Die mit Java 7 eingeführte mehrstufige Kompilierung bedeutete, dass der Hotspot-Compiler nahtlos zwischen diesen Schritten wechseln konnte. Was also passiert, ist, dass der Code nach einer bestimmten Anzahl von Durchläufen mit C1 kompiliert wird und nach weiteren Durchläufen mit C2 kompiliert wird. Dies geschieht von Methode zu Methode. Wenn also eine App ausgeführt wird, wird ein erheblicher Teil nur unter dem Interpreter ausgeführt (was für kalten Code gilt), und nachdem der Code viel (heiß) ausgeführt wurde, wird er kompiliert leistungsfähiger sein. Sie können die verschiedenen Ebenen sehen, indem Sie laufen

$ java -XX:+PrintFlagsFinal -version | grep CompileThreshold
intx Tier2CompileThreshold                     = 0
intx Tier3CompileThreshold                     = 2000
intx Tier4CompileThreshold                     = 15000
openjdk version "1.8.0_92"
OpenJDK Runtime Environment (Zulu 8.15.0.1-macosx) (build 1.8.0_92-b15)
OpenJDK 64-Bit Server VM (Zulu 8.15.0.1-macosx) (build 25.92-b15, mixed mode)

Das -XX:-TieredCompilation Ist im Wesentlichen TieredCompilation=false was bedeutet, dass Sie diesen Übergang nicht durchführen, und Sie müssen im Voraus auswählen, ob Sie den Client- oder den Server-Compiler verwenden möchten. Die JVM entscheidet anhand Ihrer CPU heuristisch, welcher Modus angewendet wird; Wenn Sie mehrere Prozessoren oder eine 64-Bit-VM haben, wird eine Server-VM (C2) verwendet, andernfalls eine Client-VM (C1).

So -Xint läuft nur mit dem Interpreter (also ohne Compiler) und man kann entweder nur C1 oder C2 mit auswählen -client oder -server jeweils zusammen mit der -XX:-TieredCompilation

  • Vielen Dank, -Xint, -client und -server waren die Flaggen, nach denen ich gesucht habe.

    – Dr. Markus Weninger

    2. August 2016 um 13:25 Uhr

  • Ich habe ein wenig über die Compilation-Level in gesprochen speakerdeck.com/alblue/hotspot-under-the-hood wenn du tiefer in den Kaninchenbau gehen willst 🙂

    – AlBlue

    2. August 2016 um 13:27 Uhr

  • Danke, werde ich mir mal anschauen! 🙂

    – Dr. Markus Weninger

    2. August 2016 um 13:30 Uhr

  • @ Markus Weninger -client und -server Flags werden in modernen Versionen von JDK einfach ignoriert. Verwenden -XX:-TieredCompilation oder -XX:TieredStopAtLevel=1 um C1 bzw. C2 zu deaktivieren.

    – angin

    2. August 2016 um 13:39 Uhr


  • TierXCompileThreshold Flags werden nicht mit Tiered Compilation verwendet, es sei denn, SimpleThresholdPolicy wird explizit mit ausgewählt -XX:CompilationPolicyChoice=2.

    – angin

    2. August 2016 um 13:42 Uhr

Benutzer-Avatar
WENPIN1

Als Java 8-Benutzer wird empfohlen, es zu deaktivieren TieredComplilation für Produktionszwecke mit Fließkomma.

Oracle wird dieses Problem auf Java8 nicht beheben. Alle Hotspot JVM 8 mit G1GC haben das gleiche Problem.

(Fehler1) (Fehler2)

  • Bugs sind ab Java 9 behoben.

    – Schreibtisch

    4. April 2019 um 4:42 Uhr

  • Und wie deaktiviert man tieredCompilation? -XX:-TieredCompilation und was verwenden Sie mit Fließkomma?

    – Lonzak

    18. Februar 2020 um 21:53 Uhr

  • Diese Fehler wurden in 8u192 und 8u201 behoben, sodass die Verwendung in Java 8 jetzt sicher ist

    – AlBlue

    22. Februar 2020 um 8:41 Uhr

1215580cookie-checkWas genau macht -XX:-TieredCompilation?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy