Istnieją różne poziomy JIT, jak zauważyliście (w tym w ogóle nie uruchomicie JIT).
W starszych wersjach Java, użyłeś aby je zaznaczyć na początku (np -Xint
, -client
, -server
), aby uruchomić z tylko tłumacza, z tylko klient (C1) kompilator, czy tylko na serwerze (C2) kompilator .
Warstwowa kompilacja, która pojawiła się w Javie 7, oznaczała, że kompilator hotspotów może płynnie przechodzić między tymi krokami. Tak więc, po pewnej liczbie przebiegów kod zostanie skompilowany za pomocą C1, a następnie po kolejnych uruchomieniach zostanie skompilowany za pomocą C2. Jest to zależne od metody, więc gdy aplikacja jest uruchomiona, znaczna część będzie działała pod interpreterem (co jest dla kodu zimnego), a następnie po uruchomieniu kodu dużo (na gorąco), to zostanie skompilowana do być bardziej wydajnym. Można zobaczyć różne poziomy uruchamiając
$ 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)
-XX:-TieredCompilation
jest zasadniczo TieredCompilation=false
co oznacza, nie rób tego przejścia, i trzeba wybrać się z przodu czy do korzystania z kompilatora klienta lub serwera. JVM heurystycznie decyduje, który tryb zastosować w zależności od procesora; jeśli masz wiele procesorów lub 64-bitową maszynę wirtualną, użyje ona maszyny wirtualnej serwera (C2), w przeciwnym razie użyje maszyny wirtualnej klienta (C1).
Więc -Xint
będzie działać tylko z tłumacza (czyli nie kompilator) i można wybrać albo tylko C1 lub C2 z -client
lub -server
odpowiednio, wraz z -XX:-TieredCompilation
Dzięki! Teraz jestem trochę zdezorientowany, ponieważ mam różne odpowiedzi: ustawiam '-XX: -TieredCompilation' teraz (1.) wyłączam C1 i zawsze kompiluję do max (C2) lub (2) prowadzę JVM do heurystycznego decydowania które poziomy kompilacji można wyłączyć w oparciu o procesor (jak podaje @AlBlue)? To także sprawia, że trudno jest mi zdecydować, którą przyjąć jako poprawną odpowiedź: P –
@ MarkusWeninger Skomentowałem pod odpowiedzią AlBlue. To nie jest bardzo dokładne. – apangin
Dzięki, właśnie to zobaczyłem. W drugim komentarzu wspomniałeś o 'TierXCompileThreshold' i' -XX: CompilationPolicyChoice = 2', o dwóch nowych rzeczach, o których wciąż nie wiem, ale o nich przeczytam. : P Ale pierwsza uwaga bardzo dobrze wyjaśnia moje pytanie. –