Just-in-time compilation-когда это происходит на Java?

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

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

мои вопросы: когда JVM фактически "решает" выполнить компиляцию точно в срок? Каковы критерии, которые делают JIT более эффективным, чем стандартная интерпретация байт-кода? Я имею в виду, что компиляция занимает некоторое время, и, насколько я понимаю, все это должно произойти, когда программа уже запущена?

1 ответов


Это широко варьируется в зависимости от вашего JVM и его настроек. Википедия:

например, виртуальная машина Java Sun имеет два основных режима-клиент и сервер. В клиентском режиме выполняется минимальная компиляция и оптимизация, чтобы сократить время запуска. В режиме сервера выполняется обширная компиляция и оптимизация, чтобы максимизировать производительность после запуска приложения, жертвуя временем запуска. Другие компиляторы Java just-in-time использовали измерение времени выполнения количество раз, когда метод выполнялся в сочетании с размером байт-кода метода в качестве эвристики, чтобы решить, когда компилировать.[4] Еще один использует количество раз, выполненных в сочетании с обнаружением циклов.[5]

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

  • он знает, что этот метод стоит потратить время на оптимизацию, потому что, ну, он называется много.
  • он знает много о реальных характеристиках этой функции:
    • если одна ветвь if утверждение гораздо более распространено, чем другое, поэтому оно может улучшить предсказания ветвлений
    • если например, a List переданный этому методу обычно является ArrayList, поэтому он может сделать оптимизацию и inlinings для конкретного случая ArrayList.

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

некоторые дополнительные сведения о том, что делает JIT здесь.