Kompilator JIT
Kompilator JIT (Just-In-Time) jest komponentem środowiska wykonawczego, który zwiększa wydajność aplikacji Java™ przez kompilowanie kodów bajtowych do rodzimego kodu maszynowego w czasie wykonywania.
Programy Java składają się z klas, które zawierają neutralne platformy kodu bajtowego, które mogą być interpretowane przez wirtualną maszynę języka Java na wielu różnych architekturach komputerowych. W czasie wykonywania maszyna JVM ładuje pliki klas, określa semantykę każdego indywidualnego kodu bajtowego i wykonuje odpowiednie obliczenia. Użycie dodatkowego procesora i pamięci podczas interpretacji oznacza, że aplikacja Java działa wolniej niż rodzima aplikacja. Kompilator JIT pomaga zwiększyć wydajność programów Java poprzez kompilowanie kodów bajtowych do rodzimego kodu maszynowego w czasie wykonywania.
Kompilator JIT jest domyślnie włączony. Jeśli metoda została skompilowana, wirtualna maszyna języka Java wywołuje skompilowany kod tej metody bezpośrednio, zamiast go interpretować. Teoretycznie, jeśli kompilacja nie wymagała czasu procesora i użycia pamięci, kompilowanie każdej metody może pozwolić na dopasowanie szybkości działania programu Java do aplikacji rodzimej.
Kompilacja JIT wymaga czasu procesora i użycia pamięci. Po pierwszym uruchomieniu maszyny JVM wywoływane są tysiące metod. Kompilowanie wszystkich tych metod może znacząco wpłynąć na czas uruchamiania, nawet jeśli w końcu program osiąga bardzo dobrą wydajność szczytową.
W praktyce metody nie są kompilowane po raz pierwszy, gdy są wywoływane. Dla każdej metody wirtualna maszyna języka Java obsługuje liczbę wywołań, która rozpoczyna się od predefiniowanej wartości progowej kompilacji i jest zmniejszana za każdym razem, gdy wywoływana jest metoda. Gdy liczba wywołań osiągnie wartość zero, wyzwalana jest kompilacja just-in-time dla metody. W związku z tym metody używane przez użytkownika są kompilowane wkrótce po uruchomieniu maszyny JVM, a metody mniej używane są kompilowane znacznie później, a nie w ogóle. Próg kompilacji JIT ułatwia szybkie uruchomienie maszyny JVM, a mimo to zwiększa wydajność. Wartość progowa została wybrana w celu uzyskania optymalnej równowagi między czasem uruchamiania a wydajnością długoterminową.
Kompilator JIT może skompilować metodę na różnych poziomach optymalizacji: cold, warm, hot, veryHotlub scorching (patrz optlevel w opcji -Xjit). Oczekuje się, że wyższe poziomy optymalizacji zapewnią lepszą wydajność, ale mają też wyższy koszt kompilacji w zakresie procesora i pamięci. Początkowy lub domyślny poziom optymalizacji dla metody to warm, ale czasami heurystyki JIT obniżają poziom optymalizacji do cold , aby zwiększyć czas uruchamiania.
Metoda może być ponownie skompilowana na wyższy poziom optymalizacji za pomocą różnych mechanizmów. Jednym z tych mechanizmów jest próbkowanie: kompilator JIT utrzymuje dedykowany wątek pobierania próbek, który budzi się okresowo i określa, które metody Java pojawiają się częściej na górze stosu. Metody takie uważa się za ważniejsze w przypadku wydajności i są kandydatami do ponownego optymalizowania na wyższych poziomach hot, veryHotlub scorching.
Można wyłączyć kompilator JIT, w którym to przypadku cały program Java będzie interpretowany. Wyłączenie kompilatora JIT nie jest zalecane, z wyjątkiem diagnozowania lub pracy wokół problemów z kompilacją JIT.