Подтвердить что ты не робот

Что делает компилятор JIT?

Я просто смотрел видеоролики Google IO, и они говорили о компиляторе JIT, который они включили в Android. Они продемонстрировали демонстрацию улучшений производительности благодаря компилятору JIT. Я задавался вопросом, что именно делает JIT-компилятор и хочет услышать от разных людей.

Итак, что является обязанностью JIT-компилятора?

4b9b3361

Ответ 1

Java-код обычно распространяется как байт-код, который является машинным независимым псевдокодом. (Эта же идея ранее использовалась в системе UCSD-p, разработанной в 70-х годах.) Преимущество этого заключается в том, что одно и то же приложение может быть запущено в разных процессорах и операционных системах. Кроме того, байт-код часто меньше, чем скомпилированное приложение.

Недостатком является то, что интерпретация кода медленная по сравнению с запущенным скомпилированным кодом. Для решения этой проблемы был разработан JIT-компилятор. Компилятор JIT компилирует код в машинный код непосредственно перед выполнением кода. Это ускоряет выполнение по сравнению с интерпретатором, но дополнительное время тратится на компиляцию при каждом запуске программы. Кроме того, поскольку компилятор JIT должен быстро компилироваться, он не может использовать сложные методы оптимизации, которые используются в статических компиляторах.

Другой подход - компиляция HotSpot. Сначала он запускается как интерпретатор, но затем обнаруживает, какие подпрограммы используются чаще всего, и компилирует только те. Преимущество заключается в том, что первоначальная задержка не возникает из-за компиляции. Кроме того, компилятор HotSpot может выполнять профилирование во время выполнения, а затем более сильную оптимизацию для наиболее важных подпрограмм. Он может даже собирать информацию, чтобы при повторном запуске одного и того же приложения он работал быстрее и быстрее. Более подробную информацию о компиляции HotSpot можно найти в в этой статье (tnx Pangea для ссылки).

Конечно, вместо использования JIT-компилятора вы можете просто использовать статический компилятор для компиляции байт-кода для вашей машины. Это позволяет полностью оптимизировать, и вам не нужно снова компилировать каждый раз при запуске приложения. Однако в телефонах и веб-страницах вы просто просто выполняете код (или апплет) один раз, поэтому компилятор JIT может быть лучшим выбором.

Ответ 2

JIT сокращен для "как раз вовремя". Компилятор JIT компилирует код, который часто находится на промежуточном языке, таком как Java-байт-код или Microsoft IL, в собственный исполняемый код, и он делает это в тот момент, когда вызывается код. Таким образом, пока код не вызывается, он существует только в переносном, неавтоматическом байтовом коде или IL, а затем, когда он вызывается, генерируется собственный код (который затем повторно используется при последующих вызовах).

Ответ 3

Это компилятор "точно в срок", на полпути между интерпретатором и компилятором (т.е. он компилируется, но только перед выполнением кода).

Это позволяет оптимизировать компиляцию с использованием динамической информации, известной только во время выполнения (поскольку компиляторы обычно запускаются статически и поэтому имеют доступ только к информации времени компиляции). Их намного сложнее написать, но они могут значительно улучшить производительность.

Для получения дополнительной информации, как всегда, см. Википедию:

При вычислении компиляция "точно в срок" (JIT), также известная как динамический перевод, является методом улучшения производительности во время выполнения компьютерной программы. Традиционно компьютерные программы имели два режима работы во время выполнения, либо интерпретированную, либо статическую (переднюю) компиляцию. Интерпретированный код был переведен с языка высокого уровня на машинный код непрерывно во время каждого исполнения, тогда как статическая компиляция переводила код в машинный код перед исполнением и требовала только этого перевода.

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

Ответ 4

JIT = Just in Time. Это процесс, при котором программа, которая в противном случае была бы интерпретирована (например, байт-коды Java или код Javascript), преобразуется в собственный машинный код "на лету", поскольку она работает для повышения производительности.

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

У этого вопроса может быть больше информации: Как компилятор JIT помогает производительности приложений?

Ответ 5

Итак, что является обязанностью JIT компилятор?

Как говорили другие, это сокращение от "Just In Time", которое в этом смысле означает "как раз вовремя для исполнения".

Когда вы скомпилируете программы для машинного кода, они часто нацелены на определенную платформу.

Следовательно, JIT был "изобрел", вы хотите скомпилировать последние бит и куски вашего кода для исполняющей платформы, поэтому см. это как "до выхода" - компилятор/оптимизатор.

JIT упрощает нашу жизнь и делает (надеюсь) наши приложения быстрее.

Есть, конечно, другие цели JIT-компиляции, выше всего лишь один из них.

Ответ 6

Довольно приятное объяснение:

"На практике методы не компилируются при первом вызове. Для каждого метода JVM поддерживает подсчет вызовов, который увеличивается каждый раз при вызове метода. JVM интерпретирует метод до его вызова счетчик превышает пороговое значение компиляции JIT. Поэтому часто используемые методы скомпилируются вскоре после запуска JVM, а менее используемые методы скомпилированы намного позже или вообще не выполняются. Порог компиляции JIT помогает быстрому запуску JVM и все еще имеют улучшенную производительность. Порог был тщательно выбран для получения оптимального баланса между временем запуска и долгосрочной производительностью.

После компиляции метода его количество вызовов reset равно нулю, а последующие вызовы метода продолжают увеличивать его счетчик. Когда количество вызовов метода достигает порога перекомпиляции JIT, компилятор JIT компилирует его второй раз, применяя больший выбор оптимизаций, чем в предыдущей компиляции. Этот процесс повторяется до тех пор, пока не будет достигнут максимальный уровень оптимизации. Самые загруженные методы Java-программы всегда оптимизируются наиболее агрессивно, максимизируя преимущества производительности при использовании JIT-компилятора. Компилятор JIT может также измерять рабочие данные во время выполнения и использовать эти данные для улучшения качества дальнейших перекомпиляций.

Компилятор JIT может быть отключен, и в этом случае вся программа Java будет интерпретирована. Отключение компилятора JIT не рекомендуется, кроме как для диагностики или устранения проблем компиляции JIT.

Источник: https://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.71.doc/diag/understanding/jit_overview.html

Ответ 7

Компилятор JIT обычно является последней частью конвейера VM и генерирует машинный код из языка посредника VM.

Он улучшает скорость, оптимизируя сгенерированный код для среды, в которой он работает (инструкции для процессора, размер кеша,...).

Традиционные компиляторы также оптимизируют сгенерированный машинный код, но они должны делать это, не зная о конкретных ресурсах, которые будут доступны во время выполнения.

Ответ 8

Компилятор Just-In-Time (JIT) является компонентом среды выполнения Java ™ Runtime Environment, которая повышает производительность приложений Java во время выполнения.

Обратитесь к документации IBM здесь.

Интерпретатор в основном делает это:

  • Прочитайте следующий исполняемый байт-код
  • Посмотрите, что такое байт-код, и найдите соответствующие ему машинные инструкции (ы)
  • Выполнить инструкцию на машинке.
  • Перейдите к шагу 1

Это просто, он работает хорошо, и он будет запускать вашу Java-программу. Но это также неэффективно, потому что поиск собственной инструкции (ов) для каждого исполняемого байт-кода, который будет выполняться, затрачивает время обработки. Таким образом, JVM содержит второй механизм, компилятор Just-In-Time, который в основном делает это:

  • Прочитайте все байт-коды для метода, который должен быть выполнен
  • Преобразуйте все эти байт-коды в инструкции на компьютере.
  • Выполнение сгенерированных инструкций на машинах.

После того, как он преобразует байт-коды для метода в собственные машинные инструкции, JVM запоминает этот собственный код, так что в следующий раз, когда этот метод должен быть запущен, он может просто запускать собственные инструкции - ему не нужно конвертировать байткоды каждый раз при запуске метода. Это заставляет программу работать намного быстрее.

Кроме того, JIT выполняет множество оптимизаций для генерации собственного кода, который работает как можно быстрее.

Ответ 9

Сомнение Сэр, если javac является компилятором Java, его роль заключается в том, чтобы преобразовать исходный код в байт-код. CLASS и затем .class(байт-код) интерпретируются средствами Java-интерпретатора (Java) с помощью JVM, а JIT является частью JVM, а затем его фактическая работа