JIT оптимизация Hotspot - PullRequest
       35

JIT оптимизация Hotspot

15 голосов
/ 22 октября 2011

В лекции о JIT в Hotspot я хочу привести как можно больше примеров конкретных оптимизаций, которые выполняет JIT.

Я знаю только о "методе встраивания", но должно быть гораздо больше. Проголосуйте за каждый пример.

Ответы [ 5 ]

14 голосов
/ 22 октября 2011

Ну, вы должны отсканировать статьи Брайана Гетца для примеров.

Короче говоря, HotSpot может и будет:

  1. Встроенные методы
  2. Соединение смежных synchronized блоков на одном объекте
  3. Устранить блокировки, если монитор недоступен из других потоков
  4. Устранить мертвый код (следовательно, большинство микропроцессоров бессмысленны)
  5. Сброс записи в память для не volatile переменных
  6. Заменить интерфейсные вызовы прямыми вызовами методов для методов, реализованных только один раз

и так далее

10 голосов
/ 22 октября 2011

На сайте Jikes RVM представлена ​​отличная презентация по оптимизации, используемой современными JVM: ACACES’06 - Динамическая компиляция и адаптивная оптимизация в виртуальных машинах

В нем обсуждаются архитектура, компромиссы, измерения и методы. И назвать как минимум 20 вещей, которые JVM делает для оптимизации машинного кода.

7 голосов
/ 22 октября 2011

Я думаю, что интересным является то, что обычный компилятор не может сделать вопреки JIT. Методы встраивания, устранение мертвого кода, CSE, анализ в реальном времени и т. Д. Также выполняются обычным компилятором c ++, здесь нет ничего «особенного» * ​​1001 *

Но что-то оптимизировать, основываясь на оптимистических предположениях, а потом деоптимизировать, если они окажутся неправильными? (предполагая определенный тип, удаляя ветки, которые впоследствии все равно будут терпеть неудачу, если не будут выполнены, ..) Удалять виртуальные вызовы, если мы можем гарантировать, что в настоящий момент существует только один класс (опять то, что надежно работает только с деоптимизацией)? Я думаю, что адаптивная оптимизация действительно отличает JIT от вашего запуска компилятора mill c ++.

Возможно, также упомяните профилирование во время выполнения, выполненное JIT, чтобы проанализировать, какие оптимизации он должен применить (хотя это уже не уникально для всех оптимизаций, управляемых профилем).

5 голосов
/ 22 октября 2011

В этой статье *1001*.

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

  • JITting «горячие точки» в нативный код
  • Адаптивное встраивание - встраивание наиболее часто вызываемых реализаций для данного метода отправки, чтобы избежать огромного размера кода

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

Существует также более подробный официальный документ и довольно нудный-gritty Вики-страница HotSpot Internals , в которой указано, как написать быстрый Java-код, который позволит вам экстраполировать, какие варианты использования были оптимизированы.

2 голосов
/ 22 октября 2011

Переход к эквивалентному машинному коду вместо интерпретации операционных кодов JVM. Отсутствие необходимости моделировать машину (JVM) в машинном коде для интенсивно используемой части Java-приложения (что эквивалентно расширению JVM) обеспечивает хорошее увеличение скорости.

Конечно, это большая часть HotSpot.

...