Используют ли JVM на десктопах компиляцию JIT? - PullRequest
3 голосов
/ 06 апреля 2010

Я всегда сталкиваюсь со статьями, в которых утверждается, что Java интерпретируется. Я знаю, что Oracle HotSpot JRE обеспечивает своевременную компиляцию, однако так ли это для большинства пользователей настольных компьютеров? Например, если я скачаю Java через: http://www.java.com/en/download,, будет ли это включать JIT-компилятор?

Ответы [ 5 ]

19 голосов
/ 06 апреля 2010

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

Сказав это, HotSpot будет интерпретировать код иногда - и это хорошо. Определенно есть части любого приложения (обычно при запуске), которые выполняются только один раз. Если вы можете интерпретировать это быстрее, чем JIT, скомпилируйте его, зачем беспокоиться о накладных расходах? С другой стороны, мой опыт статей "Java интерпретируется" заключается в том, что эти не , что они означают:)

РЕДАКТИРОВАТЬ: Чтобы принять во внимание точку Т. Дж. Краудера: да, JVM, загруженная с java.com, будет HotSpot. Однако для HotSpot есть два разных JIT - серверные и настольные. Чтобы подвести итог различий в одном предложении, настольный JIT предназначен для быстрого запуска приложений, в то время как серверный JIT больше ориентирован на высокую производительность с течением времени: серверные приложения обычно работают очень долго, поэтому время, потраченное на их оптимизацию, действительно сильно в конечном итоге окупается.

10 голосов
/ 06 апреля 2010

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

У конкретной JVM, о которой вы спрашиваете, Oracle HotSpot JVM, есть один интерпретатор и два компилятора, называемые компиляторами C1 и C2, также известные как клиент и сервер компиляторы после соответствующих им параметров командной строки. HotSpot динамически переключается между интерпретатором и одним из компиляторов во время выполнения (но он не будет переключаться между двумя компиляторами, вы должны указать один из них в командной строке, а затем только тот, который будет использоваться для все время работы JVM) .

Согласно документу здесь Начиная с некоторых более поздних выпусков Java SE 7, стала доступна новая функция под названием многоуровневая компиляция. Эта функция использует режим компилятора C1 в начале, чтобы обеспечить лучшую производительность при запуске. После правильного прогрева приложения режим компилятора C2 вступает во владение, чтобы обеспечить более агрессивные оптимизации и, как правило, лучшую производительность

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

Вы выбираете между этими двумя параметрами, указав параметры командной строки -client и -server (-client - значение по умолчанию, если вы не указали один), которое также устанавливает пару других параметров JVM, таких как порог JIT по умолчанию (в режиме -client методы будут скомпилированы после того, как они были интерпретированы 1500 раз, в режиме -server после 10000 раз, можно задать с помощью аргумента командной строки -XX:CompileThreshold).

Будет ли «большинство пользователей настольных компьютеров» работать в режиме компиляции или интерпретации, во многом зависит от того, какой код они выполняют. Я предполагаю, что подавляющее большинство пользователей настольных компьютеров используют JSM HotSpot из Oracle JRE / JDK или одного из его форков (например, SoyLatte в OSX, IcedTea или OpenJDK в Unix / BSD / Linux) и не используют параметры командной строки. поэтому они, вероятно, получат компилятор C1 с пороговым значением 1500 JIT по умолчанию. (Но приложения, такие как IntelliJ, Eclipse или NetBeans, имеют свои собственные сценарии запуска, которые обычно предоставляют различные аргументы командной строки.)

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

3 голосов
/ 06 апреля 2010

Некоторые из этих ссылок о JVM Hotspot (то, что вы скачиваете по ссылке на скачивание java.com выше) могут помочь:

1 голос
/ 06 апреля 2010

Ни один из (в остальном превосходных) ответов до сих пор, похоже, на самом деле не ответил на ваш последний вопрос, поэтому: Да , среда выполнения Java, которую вы скачали с www.java.com, является горячей точкой Oracle (Sun) JVM, и так да, это будет делать компиляцию JIT. HotSpot не только для серверов или чего-то подобного, он работает на настольных компьютерах и в полной мере использует свой (очень зрелый) оптимизирующий JIT-компилятор.

0 голосов
/ 12 августа 2013

В спецификации Jvm никогда не утверждается, как выполнять байт-код java, однако вы можете указать JIT-компилятор, если вы используете JVM из виртуальной машины hotspot, JIT - это просто методика оптимизации выполнения байт-кода.

...