(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?
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
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.
@ 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
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.