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; ListnumerosPares = 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)
Вы понимаете, что информация, полученная делятся на столбцы, и цель состоит в том, чтобы понять каждый из них.
- Время построения в миллисекундах с момента startup виртуальной машины
- Порядок построения
- Предоставляет информацию о компиляции. Например: “!” значит, что было исключение, “n” означает, что это метод, родной.
- Степень сборки. Цифры будут от 0 до 4. 0 означает, что не было сборки, только в интерпретации и 4, которые были сборки и сборки получил максимальная оптимизация.
- 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”