Что такое байт-коды и как их обрабатывает JVM

Я много раз слышал, что компиляция Java implemments JIT(just-in-time) и ее байт-коды, которые переносимы на разных платформах, "интерпретируются" JVM. Однако я действительно не знаю, что такое байт-коды и что на самом деле означает JVM в архитектуре языка Java; я хотел бы узнать больше о них.

7 ответов


JVM (виртуальная машина Java) имеет набор инструкций, как и реальная машина. Имя, данное этому набору инструкций, - байт-код Java. Это описано в Спецификация Виртуальной Машины Java. Другие языки переводятся в байт-код перед выполнением, например, Ruby и Python. Байт-код Java находится на довольно низком уровне, а python-на гораздо более высоком уровне.

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

интерпретация обычно быстро запускается, но медленно во время выполнения, в то время как JIT имеет больше накладных расходов при запуске, но работает быстрее после этого. Современные JVMs используют комбинацию интерпретации и методов JIT, чтобы получить благо обе. Байт-код сначала интерпретируется, пока JIT переводит его в фоновом режиме. После завершения компиляции JIT JVM переключается на использование этого кода вместо интерпретатора. Иногда компиляция JIT может дать лучшие результаты, чем компиляция, используемая для C и C++, поскольку она более динамична. JVM может отслеживать, как часто вызывается код и каковы типичные пути через код, и использовать эту информацию для создания более эффективного кода пока программа работает. JVM может переключиться на этот новый код так же, как при первоначальном переключении с интерпретатора на JIT-код.

Так же, как есть другие языки, которые компилируются в собственный код, например C, C++, Fortran; есть компиляторы для других языков, которые выводят байт-код JVM. Одним из примеров является язык scala. Я считаю, что groovy и jruby также могут конвертировать в байт-код java.


байт-код-это шаг между исходным кодом и фактическим машинным кодом. JVM-это то, что принимает байт-код и переводит его в машинный код.

JIT относится к тому, что JVM делает этот перевод на лету, когда программа выполняется, а не за один шаг (например, на традиционно скомпилированном/связанном языке, таком как C или c++)

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

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


когда вы компилируете что-то на Java, компилятор генерирует байт-код. Это собственный код для виртуальной машины Java. Затем JVM преобразует байт-код в собственный код для вашего процессора / архитектуры, здесь происходит JIT. Без JIT JVM будет переводить программу по одной инструкции за раз, что очень медленно.


Oracle jdk

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

байт-код-это скомпилированный формат для Java-программ. Как только программа Java была преобразована в байт-код, она может быть передана по сети и выполнена виртуальной машиной Java (JVM). Байткод файлы обычно имеют .расширение класса.


байт-код является эквивалентом JVM инструкций машинного языка.


jcyang уже предоставил ссылку на Википедию, но это лучше соответствует вашему вопросу:

Байт-Код Java

компилятор Java компилирует исходный код Java в файлы классов. Методы класса преобразуются в байтовый код, и виртуальная машина Java (JVM) интерпретирует этот байтовый код. Компилятор Just In Time (JIT) может использоваться для перевода байтового кода в машинный код для ускорения выполнения методов класса.


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