Компилирует ли Java JIT байт-код детерминистически — одни и те же оптимизации для каждого запуска на одной и той же машине?

Компилирует ли Java JIT байт-код с одной и той же оптимизацией при каждом запуске на одной и той же машине?

Учитывает ли он динамические факторы, такие как использование ЦП в данный момент, или каждый раз будет производиться одна и та же оптимизация независимо от временных факторов?


person Radu Gancea    schedule 28.06.2013    source источник
comment
Какой JIT-компилятор Java?   -  person SLaks    schedule 28.06.2013
comment
Мне интересно знать для HotSpot   -  person selig    schedule 28.06.2013
comment
Если ваша программа имеет случайность и один запуск вызывает метод A, а другой запуск вызывает метод B, то нет, вы не получите одинаковых оптимизаций.   -  person Louis Wasserman    schedule 28.06.2013
comment
Но что, если используются одни и те же пути кода?   -  person selig    schedule 28.06.2013
comment
Я не уверен, что это полезно для вас, но вы можете заставить его оптимизировать свою функцию разными способами. См.: stackoverflow.com/questions/19852847/   -  person    schedule 12.11.2013


Ответы (1)


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

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

Исследователи, использующие Jikes RVM, решили эту проблему в своих тестах с помощью функции под названием Воспроизведение компилятора.

person Sam Harwell    schedule 28.06.2013