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

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

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

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

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

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

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

* он знает, что этот метод стоит потратить время на оптимизацию, потому что, ну, он называется много.
* он знает много о реальных характеристиках этой функции:
	+ если одна ветвь `if` утверждение гораздо более распространено, чем другое, поэтому оно может улучшить [предсказания ветвлений](https://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array)
	+ если например, a `List` переданный этому методу обычно является `ArrayList`, поэтому он может сделать оптимизацию и inlinings для конкретного случая `ArrayList`.

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

некоторые дополнительные сведения о том, что делает JIT [здесь](http://www.oracle.com/technetwork/java/whitepaper-135217.html#hotspot).