Рубрики
Без рубрики

[PT-BR] Компилятор Falando sobre JIT

JVM (виртуальная машина Java) – это фундаментальный элемент платформы Java. Грасас а эсте рекурсивно, э… Помеченный java, jvm, ptbr.

A JVM (Виртуальная машина Java) это фундаментальная часть платформы Ява . Благодаря этой функции, можно писать код и запустить- в разных операционных системах. Разница этого подхода в отношении процесса осуществляются другие языки, например C++ является отсутствие необходимости в компиляции кода для различных S. O’s. Хотя чего преимущество, процитированном ранее, этот подход приносит некоторые trade-off’s , между ними, влияние на производительность. В то время как в C++ код компилируется и работает изначально ( двоичный), в Java необходимо быть скомпилирован для байт (в языке JVM понимает), интерпретировать (двоичный) и работает изначально. Как представляется, мало разницы между двумя языками, при необходимости, узел Java , выполнить всего лишь один шаг, но этот шаг имеет решающее значение для производительности. Одной из мер, принятых инженеров и разработчиков платформы, было создать механизм, который помогает и обеспечивает больше производительности и в интерпретации. Этот механизм известен как JIT-Compiler или Как раз вовремя Компилятор .

Чтобы понять, JIT необходимо понять, даже в общих чертах, что | JVM| делает. Ее цели-интерпретации байт и управление памятью приложения. В то время как фокус будет в первой целью.

Изображение выше показывает процесс компиляции кода Java для байт загрузка | JVM| и интерпретации двоичного. Проблема этих действий в том, что приложения, тот же метод или блок кода будет вызываться много раз в течение жизненного цикла приложения, когда требуется перевод на каждый раз. Como pode-se imaginar, о влиянии на производительность, об экспоненциальном повышении производительности и о пенсандо ниссо, о разработке платформы для разработки идей/| JIT-компилятор . O JIT процесс, который происходит параллельно интерпретация (в другой поток) и ваша цель преобразования (компиляции) фрагменты кода, выполняемых на машинном языке (в двоичном формате). Разница в интерпретации по умолчанию, цит. ранее, в том, что как процесс будет запущен, когда будет улучшение в сборки, пока не дойдете до максимальной степени оптимизации. Достигнув этой степени, | JVM| не нуждается в интерпретации этого фрагмента кода.

Процесс сборки выполнения , приведенном выше, можно увидеть с помощью flag -XX:+печать компиляции во время выполнения проекта. Для примера, будет использовать код ниже:

import java.util.*;
public class Principal {
    public static void main(String[] args) {
        Integer numeroMaximo = Integer.parseInt(args[0]);
        Principal principal = new Principal();
        principal.guardarNumerosPares(numeroMaximo);
    }
    private void guardarNumerosPares(Integer numeroMaximo){
        int numero = 0;
        List numerosPares = new ArrayList<>();
        while(numero <= numeroMaximo) {
            if(validarSeEPar(numero)) numerosPares.add(numero);
            numero++;
        }
    }
    private Boolean validarSeEPar(Integer numero) {
        if (numero % 2 == 0) return true;
        return false;
    }
}

Идея кода является довольно простой. Пользователь дает число в качестве аргумента, и программа проверяет, какие четные числа в диапазоне от 0 до числа, полученного. Чтобы запустить его с flag требуется строки java -XX:+printкомпиляция Принципал 10 . Результат будет:

24    1       3       java.lang.String::isLatin1 (19 bytes)
25    3       3       java.lang.StringLatin1::hashCode (42 bytes)
26    6       3       java.util.ImmutableCollections$SetN::probe (56 bytes)
28    9       3       java.lang.StringLatin1::equals (36 bytes)
28   10       3       java.util.ImmutableCollections$SetN::hashCode (46 bytes)
29    4       3       java.lang.Object:: (1 bytes)
29    2       3       java.lang.String::hashCode (60 bytes)
30    5       3       java.lang.Math::floorMod (20 bytes)
30    8       3       java.util.Set::of (4 bytes)
31   11       3       java.util.Objects::requireNonNull (14 bytes)
31   18       4       java.lang.Object:: (1 bytes)
31   13       3       java.lang.String::coder (15 bytes)
32    4       3       java.lang.Object:: (1 bytes)   made not entrant
33   22       3       java.util.ImmutableCollections$SetN$SetNIterator::next (47 bytes)
33   26     n 0       jdk.internal.misc.Unsafe::getReferenceVolatile (native)
33   20       3       java.util.ImmutableCollections$MapN::probe (60 bytes)
34   29   !   3       java.util.concurrent.ConcurrentHashMap::putVal (432 bytes)
36   16       3       java.util.ImmutableCollections$SetN$SetNIterator::nextIndex (56 bytes)
36   32       3       java.util.HashMap::hash (20 bytes)
37   35       3       java.util.HashMap::putVal (300 bytes)
38   23       3       java.util.ImmutableCollections$SetN$SetNIterator::hasNext (13 bytes)
38   44       4       java.lang.String::hashCode (60 bytes)
38    7       3       java.lang.String::equals (50 bytes)
39   36       3       java.util.HashMap::newNode (13 bytes)
42    2       3       java.lang.String::hashCode (60 bytes)   made not entrant
43   46       4       java.util.ImmutableCollections$SetN$SetNIterator::nextIndex (56 bytes)
44   14       1       java.lang.module.ModuleReference::descriptor (5 bytes)
44   16       3       java.util.ImmutableCollections$SetN$SetNIterator::nextIndex (56 bytes)   made not entrant
45   12       1       java.lang.module.ModuleDescriptor::name (5 bytes)
46   21       1       java.lang.module.ResolvedModule::reference (5 bytes)
46   44       4       java.lang.String::hashCode (60 bytes)   made not entrant
47   33       1       java.lang.module.ModuleDescriptor$Exports::source (5 bytes)
47   31       1       java.util.ImmutableCollections$SetN::size (5 bytes)

Вы понимаете, что информация, полученная делятся на столбцы, и цель состоит в том, чтобы понять каждый из них.

  1. Время построения в миллисекундах с момента startup виртуальной машины
  2. Порядок построения
  3. Предоставляет информацию о компиляции. Например: “!” значит, что было исключение, “n” означает, что это метод, родной.
  4. Степень сборки. Цифры будут от 0 до 4. 0 означает, что не было сборки, только в интерпретации и 4, которые были сборки и сборки получил максимальная оптимизация.
  5. Full qualified name класса и метода, который прошел через сборки.

Методы применения не указан в списке методов компиляции, это происходит потому, что время реализации проекта было не достаточно, чтобы требуется сборка оптимизирована. Увеличивая количество до 50000 это поведение будет изменено.

java -XX:+printкомпиляция Основной капитал 50000

//Resto das informações omitidas para facilitar a visualização
68   54       2       Principal::validarSeEPar (19 bytes)
68   52       2       java.lang.Integer:: (10 bytes)   made not entrant
69   60       4       java.lang.Integer::valueOf (32 bytes)
69   50       1       java.lang.Boolean::booleanValue (5 bytes)
70   55       2       java.lang.Boolean::valueOf (14 bytes)
70   53       2       java.lang.Integer::valueOf (32 bytes)   made not entrant
71   61       4       Principal::validarSeEPar (19 bytes)
73   56       2       java.util.ArrayList::add (25 bytes)
75   54       2       Principal::validarSeEPar (19 bytes)   made not entrant
76   57       2       java.util.ArrayList::add (23 bytes)
76   41       3       java.util.HashMap$Node:: (26 bytes)
77   62       4       java.util.ArrayList::add (25 bytes)
77   14       1       java.lang.module.ModuleReference::descriptor (5 bytes)

Увеличивая количество предоставляемых для системы, метод validarSeEPar проходит заказать более раз, что требует оптимизации по части | JVM| . Это можно проверить уже в первой строке, что метод был скомпилирован с степени 2, и с течением времени произошли улучшения в проект, перейдя в 4 класс в строке 7.

За счет параллельного выполнения JIT , приложение может страдать производительность мгновение, но в долгосрочной перспективе, как приложение будет запущено, тем больше реализации будет получение текучее.

Идея была показать о том, как инженеры Java мысли повышения производительности приложений и уменьшения trade-off из компилируемых языков/истолкованы. Это только малая часть того, что a | JVM| делает. Есть еще сведения о том, как JIT охрана методы, составляются в 4 класс, в памяти, среди других вопросов, которые будут для будущих должностей. Вопросы и предложения всегда приветствуются. До следующего!!

Оригинал: “https://dev.to/j_a_o_v_c_t_r/pt-br-falando-sobre-jit-compiler-bni”