Хорошо, я нашел, где я это читал. Это все из «Изучения Java» (O'Reilly 2005):
Проблема с традиционной JIT-компиляцией заключается в том, что оптимизация кода требует времени. Таким образом, JIT-компилятор может давать приличные результаты, но может иметь значительные задержки при запуске приложения. Как правило, это не проблема для долго работающих серверных приложений, но это серьезная проблема для клиентского программного обеспечения и приложений, запускаемых на небольших устройствах с ограниченными возможностями. Для решения этой проблемы технология компиляции Sun, называемая HotSpot, использует прием, называемый адаптивной компиляцией. Если вы посмотрите на то, на что на самом деле тратят программы, оказывается, что они тратят почти все свое время на выполнение сравнительно небольшой части кода снова и снова. Кусок кода, который выполняется многократно, может составлять лишь небольшую часть всей программы, но его поведение определяет общую производительность программы. Адаптивная компиляция также позволяет среде выполнения Java использовать преимущества новых видов оптимизации, которые просто невозможно выполнить на статически скомпилированном языке, поэтому в некоторых случаях утверждается, что код Java может выполняться быстрее, чем C / C ++.
Чтобы воспользоваться этим фактом, HotSpot запускается как обычный интерпретатор байт-кода Java, но с отличием: он измеряет (профилирует) код во время его выполнения, чтобы увидеть, какие части выполняются повторно. Как только он узнает, какие части кода имеют решающее значение для производительности, HotSpot компилирует эти разделы в оптимальный машинный код. Поскольку он компилирует только небольшую часть программы в машинный код, он может позволить себе потратить время, необходимое для оптимизации этих частей. Остальная часть программы может не скомпилироваться вообще - только что интерпретированная - экономия памяти и времени. На самом деле Java VM по умолчанию Sun может работать в одном из двух режимов: клиент и сервер, которые сообщают ему, следует ли подчеркивать быстрое время запуска и сохранение памяти или снижать производительность.
Естественный вопрос, который следует задать в этот момент: зачем выбрасывать всю эту хорошую информацию о профилировании каждый раз, когда приложение закрывается? Что ж, Sun частично затронула эту тему с выпуском Java 5.0 благодаря использованию общих классов только для чтения, которые постоянно хранятся в оптимизированной форме. Это значительно сокращает время запуска и накладные расходы на запуск многих приложений Java на данном компьютере. Технология для этого сложна, но идея проста: оптимизируйте те части программы, которые должны работать быстро, и не беспокойтесь об остальном.
Мне интересно, как далеко продвинулась Sun с Java 5.0.