Selektywne wyłączanie kompilatora JIT lub AOT

Jeśli błąd programu Java™ wskazuje na problem z kompilatorem JIT lub AOT, można spróbować zawęzić ten problem dalej.

O tym zadaniu

Domyślnie kompilator JIT optymalizuje metody na różnych poziomach optymalizacji. Różne opcje optymalizacji są stosowane do różnych metod, które są oparte na ich liczebności wywołań. Metody, które są wywoływane częściej, są optymalizowane na wyższych poziomach. Zmieniając parametry kompilatora JIT, można kontrolować poziom optymalizacji, przy którym metody są zoptymalizowane. Użytkownik może określić, czy optymalizator jest w błędzie, a jeśli jest, która optymalizacja jest problematyczna.

Kompilator AOT domyślnie kompiluje metody na poziomie optymalizacji warm . Wymuszenie kompilowania przez kompilator AOT metody na wyższym poziomie jest możliwe, ale nie jest obsługiwane.

Parametry JIT są określane jako lista rozdzielana przecinkami, która jest dołączana do opcji -Xjit . Składnia jest następująca: -Xjit:< param1>,< param2>=< wartość>. Na przykład:
java -Xjit:verbose,optLevel=noOpt HelloWorld
uruchamia program HelloWorld , włącza szczegółowe dane wyjściowe z JIT i sprawia, że JIT generuje rodzimy kod bez wykonywania żadnych optymalizacji. Opcje optymalizacji są wymienione w opcji -Xjit. Kompilator AOT jest sterowany w podobny sposób, za pomocą opcji -Xaot . Opcji -Xjit należy używać podczas diagnozowania problemów z kompilatorem JIT, a także opcji -Xaot podczas diagnozowania problemów z kompilatorem AOT.

Aby określić, która część kompilatora jest przyczyną niepowodzenia, wykonaj następujące kroki:

Procedura

  1. Ustaw parametr JIT lub AOT count=0 , aby zmienić wartość progową kompilacji na zero. Ten parametr powoduje, że każda metoda Java jest kompilowana przed jej uruchomieniem.
    Opcji count=0 należy używać tylko w przypadku diagnozowania problemów, ponieważ wiele metod jest kompilowanych, w tym metod, które są rzadko używane. Dodatkowa kompilacja wykorzystuje więcej zasobów obliczeniowych i spowalnia aplikację.
    W przypadku produktu count=0aplikacja nie powiedzie się natychmiast po osiągnięciu obszaru problemu. W niektórych przypadkach użycie produktu count=1 może być bardziej niezawodne powielanie awarii.
  2. Dodaj disableInlining do parametrów kompilatora JIT lub AOT.
    disableInlining wyłącza generowanie większego i bardziej złożonego kodu.
    Jeśli problem nie występuje, użyj disableInlining jako obejście, podczas gdy zespół usług Java analizuje i naprawia problem kompilatora.
  3. Zmniejszaj poziomy optymalizacji, dodając parametr optLevel i ponownie uruchom program, aż do momentu, gdy niepowodzenie nie nastąpi, lub dotrą do poziomu noOpt . W przypadku problemu z kompilatorem JIT należy rozpocząć od scorching i pracować w dół listy. W przypadku problemu z kompilatorem AOT należy rozpocząć od warm i pracować w dół listy.
    Poziomy optymalizacji są w kolejności malejącej:
    1. scorching
    2. veryHot
    3. hot
    4. warm
    5. cold
    6. noOpt

Co dalej

Jeśli jedno z tych ustawień spowoduje zniknięcie Twojego błędu, istnieje obejście, którego można użyć. To obejście jest tymczasowe, gdy zespół usług Java analizuje i rozwiąże problem z kompilatorem. Jeśli usunięcie produktu disableInlining z listy parametrów JIT lub AOT nie spowoduje ponownego wyświetlenia, należy to zrobić, aby zwiększyć wydajność. Aby zwiększyć wydajność obejścia, należy postępować zgodnie z instrukcjami w sekcji Znajdowanie niesprawnej metody .

Jeśli błąd nadal występuje na poziomie optymalizacji noOpt , należy wyłączyć kompilator JIT lub AOT jako obejście.