2016-08-02 74 views
24

Używanie java -XX:+PrintFlagsFinal Znalazłem flagę TieredCompilation i czytałem o niej trochę online.Co dokładnie robi -XX: -TieredCompilation?

Jednak nadal nie wiem, dokładnie, co się stanie, gdy ustawi się go na false.

wiem, że system kompilacja obsługuje 5 poziomów wykonanie, w zasadzie podzielony na tłumacza, C1 i C2:

  • poziom 0 - interpreter
  • poziom 1 - C1 z pełną optymalizacją (bez profilowania)
  • poziom 2 - C1 o wywołania i backedge liczników
  • poziom 3 - c1 pełnego profilu (poziom 2 + MDO)
  • poziomie 4 - C 2

Źródło: http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34

dwa pytania:

(1) Poprzez ustawienie -XX:-TieredCompilation są niektóre z tych poziomów po prostu wyłączone? Jeśli tak, które?

(2) Czy jest jakaś flaga decydująca o tym, czy wyłączyć C1 lub C2, czy też nie kompilować w ogóle?

Odpowiedz

24

-XX:-TieredCompilation wyłącza kondygnacje pośredni kompilacji (1, 2, 3), aby metoda została zinterpretowana lub skompilowana na maksymalnym poziomie optymalizacji (C2).

Jako efekt uboczny flaga TieredCompilation zmienia także liczbę wątków kompilatora, zasadę kompilacji i domyślny rozmiar pamięci podręcznej kodu. Zauważ, że z TieredCompilation wyłączony

  • będzie mniej wątków kompilatora;
  • zostanie wybrana prosta strategia kompilacji (oparta na metodzie inwokacji i licznikach zabezpieczeń) zamiast advanced compilation policy;
  • domyślny rozmiar pamięci podręcznej zarezerwowanego kodu to 5 times smaller.

Aby wyłączyć kompilator C2 i pozostawić tylko C1 bez dodatkowych kosztów, należy ustawić -XX:TieredStopAtLevel=1.

Aby wyłączyć wszystkie kompilatory JIT i uruchomić wszystko w tłumaczu, należy użyć -Xint.

+0

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 –

+0

@ MarkusWeninger Skomentowałem pod odpowiedzią AlBlue. To nie jest bardzo dokładne. – apangin

+0

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. –

10

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

+1

Dzięki, '-Xint',' -client' i '-server' były flagami, których szukałem. –

+1

Porozmawiałem trochę o poziomach kompilacji w https://speakerdeck.com/alblue/hotspot-under-the-hood, jeśli chcesz zagłębić się w króliczą dziurę :) – AlBlue

+0

Dzięki, przyjrzę się temu ! :) –

Powiązane problemy