2013-02-22 2 views
25

У меня есть критически важный для работы метод, часто вызываемый при запуске приложения. В конце концов, он получает JIT-компиляцию, но не после некоторого заметного времени, которое выполняется в интерпретаторе.Могу ли я заставить JVM изначально компилировать данный метод?

Есть ли способ сообщить JVM, что я хочу, чтобы этот метод был скомпилирован с самого начала (без настройки других внутренних элементов с такими вещами, как -XX:CompileThreshold)?

+0

Можете ли вы запустить реалистичную синтетическую разминку этого метода или сделать что-то, что невозможно подделать? – Matt

+1

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

+0

не могли бы вы упростить конфигурацию? изменить его из xml в более простой формат свойств или что-нибудь, чтобы уменьшить количество кода, необходимого для его чтения? возможно, разделить конфигурацию на «загрузочную» часть, небольшую, насколько возможно, только для запуска и основную часть, которую вы могли бы загрузить в фоновом режиме? возможно, распараллеливать работу, так что, хотя код интерпретируется, вы можете получить скорость от потоковой передачи? – radai

ответ

32

Единственный способ, которым я знаю, это флаг -Xcomp, но это обычно не рекомендуется использовать. Он запускает немедленную компиляцию JIT всех классов и методов при первом запуске. Недостатком является то, что при первоначальном запуске вы увидите снижение производительности (из-за увеличения активности JIT). Другим основным ограничением с этим флагом является то, что он отключает инкрементную оптимизацию на основе профилирования, которую обычно выполняет JIT. В стандартном смешанном режиме компилятор JIT может (и будет) деоптимизировать и повторно компилировать части кода постоянно на основе собранной информации профилирования и времени выполнения. Это позволяет ему «исправлять» ошибочные оптимизации, такие как граничные проверки, которые были опущены, но оказались необходимыми, субоптимальные инлайны и т. Д. -Xcomp отключает оптимизацию на основе профилирования и в зависимости от программы может привести к значительным потерям производительности в целом только для небольшого или нет реального выигрыша при запуске, поэтому его не рекомендуется использовать.

Beyond к -Xcomp (который довольно брутальный) и -XX:CompileThreshold (который контролирует, сколько расстрелы данного метода JIT будет работать в режиме intepreted для сбора статистики перед компиляцией/оптимизировать его), есть также -Xbatch. Это заставляет компиляцию JIT на «передний план», по сути, блокируя вызовы методов до тех пор, пока она не была скомпилирована, вместо того, чтобы компилировать ее в фоновом режиме, как это обычно бывает.

Вы не указали, какую версию Java вы используете, но если Java 7 является для вас вариантом, она представляет новую JIT-модель под названием «Tiered compilation» (активируется с помощью переключателя -XX:+TieredCompilation). Что такое многоуровневая компиляция, так это то, что она позволяет выполнить начальную, меньшую компиляцию при первом использовании метода, а не позже, более крупную компиляцию/оптимизацию на основе собранных данных профилирования. Похоже, это должно быть интересно для вас.

Предполагается, что он требует дополнительной настройки и параметров/конфигураций, но у меня нет возможности проверить его дальше.

+0

Спасибо за хороший список всех этих опций. Слишком плохо, что они не могут быть установлены на более тонком уровне ... –

+0

Я думаю, что TieredCompilation не наносит слишком большого урона, так как он вообще ничего не изменит в долгосрочной перспективе – radai

2

im не уверен, что он полностью прекомпилирует код, но вы можете добавить свой класс с помощью критического метода в общий дамп данных JVM. см. this question для более подробной информации.

также, вы считали JNI? если ваш метод очень интенсивен, он может значительно ускорить процесс.

+0

Интересно. Похоже, что это только улучшает загрузку классов и не затрагивает JIT-компилятор. Или я чего-то не хватает? Я хотел бы избежать JNI и скомпилировать собственный код на всех платформах, где мы развертываем ... –

Смежные вопросы