Java-код и JIT-компиляция - PullRequest
       16

Java-код и JIT-компиляция

3 голосов
/ 01 августа 2010

Java-код компилируется в байт-код, который переносится на многие платформы.Но Java также JIT-компилируется, что происходит на лету.

Означает ли это, что Java компилируется дважды?первым мы производим байт-код, а вторым - JVM?Спасибо.

Ответы [ 5 ]

7 голосов
/ 01 августа 2010

Ваш код может быть скомпилирован из байт-кода в нативный код JVM, если он «достаточно горячий»; и он может быть скомпилирован несколько раз, при этом старая версия будет удалена, в зависимости от характеристик времени выполнения вашей программы.

JIT - сложный зверь; на самом деле Sun JVM имеет два JIT (-client и -server), которые ведут себя по-разному друг от друга, и некоторые реализации даже поддерживают оба JIT, работающие вместе (поэтому вы могли интерпретировать байт-код, выполняемый вместе с кодом, скомпилированным двумя различными JIT в вашем приложении) .

Я рекомендую вам прочитать больше о Hotspot (наиболее распространенном JIT, так как это Sun), если вы действительно интересуетесь этой темой. Вы можете начать со страницы Sun .

7 голосов
/ 01 августа 2010

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

Короче говоря: Да, но по очень веской причине

2 голосов
/ 01 августа 2010

Означает ли это, что Java компилируется дважды?первым мы производим байт-код, а вторым - JVM?Спасибо.

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

1 голос
/ 01 августа 2010

механизм

Java -> Байт-код (скомпилирован Java-компилятором)

ByteCode -> собственный код (интерпретируется JVM)

0 голосов
/ 02 августа 2010

Краткий ответ: Да, вроде.

Самый длинный: это 2 разные вещи.Первая компиляция из исходного кода в байт-код часто вызывает промежуточное представление (IR) в поле компиляции.

Затем виртуальная машина берет байт-код и переводит его обратно в собственный код, на какой платформе он установлен..

Это 2 совершенно разных вида компиляции.Второе - даже не совсем компиляция, так как анализатор контекста проверки синтаксиса отсутствует ... Ну, есть некоторая проверка, но не такая, как в компиляторе.

...