W jaki sposób JVM zdecydował się skompilować metodę JIT (skategoryzować metodę jako "hot")?

Pracowałem już z -XX:+PrintCompilation i znam podstawowe techniki kompilatora JIT i dlaczego JIT-compilation jest używany.

Nadal Nie wiem, jak JVM decyduje się JIT-skompilować metodę, tzn. "kiedy nadszedł właściwy czas, aby JIT-skompilować metodę".

Czy mam rację z założeniem, że każda metoda zaczyna być interpretowana i dopóki nie zostanie sklasyfikowana jako "gorąca metoda", nie zostanie skompilowana? Mam coś z tyłu głowy, co czytam, że metoda jest uważany za "gorący", gdy został wykonany co najmniej 10.000 razy (po interpretacji metody 10.000 razy zostanie skompilowany), ale muszę przyznać, że nie jestem pewien, czy to i gdzie czytałem.

Podsumowując moje pytanie:

(1) Czy każda metoda jest interpretowana tak długo, jak długo nie została sklasyfikowana jako metoda "hot" (i dlatego została skompilowana) czy istnieją powody, dla których metody są kompilowane, nawet jeśli nie są "hot"?

(2) Jak JVM kategoryzować metody do metod" non-hot "I" hot"? Liczba egzekucji? Coś jeszcze?

(3) Jeśli istnieją pewne progi (np. liczba wykonań) dla metod "gorących", to czy istnieją znaczniki Java (-XX:...) do ustawiania tych progów?

Author: Markus Weninger, 2016-02-24

2 answers

Zasady kompilacji hotspotów są dość złożone, szczególnie w przypadku kompilacji warstwowej, która jest domyślnie włączona w Javie 8. Nie jest to ani liczba egzekucji, ani kwestia parametru CompileThreshold.

Najlepsze wyjaśnienie (najwyraźniej jedyne rozsądne wyjaśnienie) można znaleźć w źródłach hotspotów, zobacz advancedThresholdPolicy.hpp .

Podsumuję główne punkty tej zaawansowanej polityki kompilacji:

  • wykonanie rozpoczyna się od poziomu 0 (Tłumacz).
  • głównymi wyzwalaczami kompilacji są
    1. Licznik wywołania metody i;
    2. Licznik backedge b. Gałęzie wstecz zazwyczaj oznaczają pętlę w kodzie.
  • Za każdym razem liczniki czasu osiągają określoną wartość częstotliwości (TierXInvokeNotifyFreqLog, TierXBackedgeNotifyFreqLog), wywołana jest polityka kompilacji, która decyduje, co dalej z aktualnie uruchomioną metodą. W zależności od wartości i, b i aktualne obciążenie wątków kompilatora C1 i C2 można zdecydować do

    • kontynuuj wykonywanie w interpreterze;
    • zacznij profilować w interpreterze;
    • Metoda kompilacji z C1 na poziomie 3 z pełnymi danymi profilu wymaganymi do dalszej rekompilacji;
  • metoda kompilacji z C1 na poziomie 2 bez profilu, ale z możliwością przekompilowania (mało prawdopodobne);
  • wreszcie skompilować metodę z C1 na poziomie 1 bez profilu lub liczników (również mało prawdopodobne).

Kluczowe parametry to TierXInvocationThreshold i TierXBackEdgeThreshold. Progi mogą być dynamicznie dostosowywana dla danej metody w zależności od długości kolejki kompilacji.

  • Kolejka kompilacji nie jest kolejką FIFO, lecz kolejką priorytetową.

  • C1-skompilowany kod z danymi profilu (tier 3) zachowuje się podobnie, z tym że progi przejścia na następny poziom (C2, tier 4) są znacznie większe. Np. metoda zinterpretowana może być skompilowana na poziomie 3 po około 200 wywołaniach, podczas gdy metoda skompilowana C1 podlega rekompilacji na poziomie 4 po 5000 + inwokacji.

  • specjalna polityka jest używana do metody inlining. Małe metody mogą być wbudowane w rozmówcę, nawet jeśli nie są "gorące". Nieco większe metody mogą być inlinowane tylko wtedy, gdy są często wywoływane (InlineFrequencyRatio, InlineFrequencyCount).
  •  46
    Author: apangin,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2016-02-24 22:11:57

    Głównym parametrem kontrolującym to jest -XX:CompileThreshold=10000

    Hotspot dla Javy 8 używa teraz domyślnie wielopoziomowej kompilacji, używając kilku etapów kompilacji od poziomu 1 do 4. Uważam, że 1 nie jest optymalizacją. Level 3 to C1 (oparty na kliencie klienta) a Level 4 to C2 (oparty na kompilatorze serwera)

    Oznacza to, że mała optymalizacja może nastąpić wcześniej niż można się spodziewać i może utrzymać optymalizację długo po osiągnięciu progu 10K. Najwyższe jakie widziałem to analiza ucieczki eliminacja StringBuilder po milionie połączeń.

    Uwaga: wielokrotna iteracja pętli może wywołać kompilator. np. pętla 10K razy może wystarczyć.

    1) dopóki metoda nie zostanie uznana za wystarczająco gorącą, jest interpretowana. Azul Zing) może kompilować metody podczas uruchamiania i można wymusić JVM Hotspot skompilować metodę za pośrednictwem wewnętrznego API. Java 9 może również mieć kompilator AOT (z wyprzedzeniem), ale wciąż jest badana AFAIK

    2) Liczba połączeń lub liczba iteracji.

    3) tak -XX:CompileThreshold= jest głównym.

     7
    Author: Peter Lawrey,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2016-02-24 12:18:04