Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Оптимизация реестра JIT-компилятора Java

Автор вопроса: naveОтветов: 1

Я смотрю на некоторый выходной собственный код компилятора Hotspot VM JIT. Метод, который я анализирую, использует множество локальных переменных. Я ожидал, что это повлияет на распределение регистров и вызовет загрузку/сохранение в память и из памяти. Однако я не вижу никаких инструкций по загрузке/сохранению в нативном коде. В связи с этим у меня есть 2 связанных вопроса.

  1. Я читал, что виртуальная машина Java имеет архитектуру на основе стека, в которой вместо использования регистров в качестве блокнота для вычислений используется стек. Таким образом, компилятор JIT также следует модели на основе стека или модели на основе регистров?

  2. Если JIT основан на регистрах, что делает JIT-компилятор при исчерпании регистров? Использует ли JIT-компилятор какой-либо другой метод для обработки этого случая, или это тот случай, когда я не вижу загрузки/сохранения в память и из памяти просто потому, что у меня недостаточно локальных переменных?

  • 1) регистры 2) это трудно сказать, не зная, какой у вас процессор (мы можем догадаться) и сколько у вас локальных переменных Erwin Bolwidt 09.11.2015
  • @ErwinBolwidt Хм ... Допустим, есть 32 регистра и более 50 локальных переменных? В основном в регистрах может храниться больше переменных, чем это. Чего я могу ожидать в этом случае? Должен ли я видеть распространение на память? nave 09.11.2015
  • Ассемблер для Java VM, Jasmin, основан на стеке. На машинном уровне все еще есть регистры, но я думаю, что ассемблерный код для java - это уровень абстракции выше этого. Brady Sheehan 09.11.2015
  • @BradySheehan Я не уверен, какая связь между Жасмин и вопросом. assylias 09.11.2015

javajvmmemoryjitregister-allocation

Ответы

Ответ 1 · рейтинг 2 · the8472

Прежде всего, ваш вопрос зависит от используемой вами архитектуры JVM и ЦП.

Я предполагаю, что вы говорите о точке доступа.

Таким образом, компилятор JIT также следует модели на основе стека или модели на основе регистров?

Байт-код работает со стеком, но он транслируется через несколько уровней, последний из которых основан на регистрах.

Если JIT основан на регистрах, что делает JIT-компилятор при исчерпании регистров?

Он может попасть в стек или может применить другие оптимизации для уменьшения нагрузки на регистры, в зависимости от их стоимости.

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

Взгляните на вики OpenJDK, там есть несколько страниц о распределении регистров, а также более ранние этапы оптимизации.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы