Подтвердить что ты не робот

Могу ли я заставить JVM изначально компилировать данный метод?

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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