Оптимизация JIT Hotspot
В лекции о JIT в Hotspot я хочу привести как можно больше примеров конкретных оптимизаций, которые выполняет JIT.
Я знаю только "метод inlining", но должно быть намного больше. Проголосуйте за каждый пример.
Ответы
Ответ 1
Хорошо, вам следует отсканировать статьи Брайана Гетца.
Вкратце, HotSpot может и будет:
- Встроенные методы
- Присоединить смежные блоки
synchronized
на одном и том же объекте
- Устранить блокировки, если монитор недоступен из других потоков.
- Устранить мертвый код (следовательно, большинство микро-тестов бессмысленны)
- Запись памяти памяти для переменных
volatile
- Заменить вызовы интерфейса прямыми вызовами метода для методов, реализованных только один раз
et cetera
Ответ 2
Существует отличная презентация об оптимизации, используемой современными JVM на сайте Jikes RVM:
ACACES06 - Динамическая компиляция и адаптивная оптимизация в виртуальных машинах
В нем обсуждается архитектура, компромиссы, измерения и методы. И имена как минимум 20 вещей JVM делают для оптимизации машинного кода.
Ответ 3
Я думаю, что интересный материал - это те вещи, которые обычный компилятор не может делать вопреки JIT. Методы инкрустации, устраняя мертвый код, CSE, живой анализ и т.д., Все делается вашим средним компилятором С++, ничего особенного здесь
Но оптимизируя что-то, основанное на оптимистичных предположениях, а затем более поздно преувеличивая, если они оказываются неправыми? (предполагая определенный тип, удаляя ветки, которые позже не удастся, но если это не будет сделано,..) Удаление виртуальных вызовов, если мы можем гарантировать, что на данный момент существует только один класс (опять-таки то, что только надежно работает с деоптимизацией)? Адаптивная оптимизация - это, на мой взгляд, одна вещь, которая действительно отличает JIT от запуска компилятора mill С++.
Может быть, также упоминается профилирование времени выполнения, выполненное JIT, для анализа того, какие оптимизации он должен применять (но не тот, что уникален больше, несмотря на все оптимизации, ориентированные на профиль).
Ответ 4
Там старый, но, вероятно, все еще действительный обзор в в этой статье.
Основные моменты, по-видимому, выполняют классическую оптимизацию на основе имеющейся информации профилирования во время выполнения:
- JITting "горячие точки" в собственный код
- Адаптивная вставка - вложение наиболее часто называемых реализаций для отправки данного метода, чтобы избежать большого размера кода
И некоторые второстепенные, такие как генераторный GC, который упрощает выделение короткоживущих объектов и различные другие меньшие оптимизации, плюс все, что было добавлено после публикации этой статьи.
Кроме того, более подробный официальный документ и довольно ничтожный Wiki-страница HotSpot Internals, в которой описывается, как быстро писать Java-код, который должен позволить вам экстраполировать, какие варианты использования были оптимизированы.
Ответ 5
Переход на эквивалентный код машинного кода вместо JVM-интерпретации op-кодов. Отсутствие необходимости моделирования машины (JVM) в машинных кодах для сильно используемой части приложения Java (что эквивалентно расширению JVM) обеспечивает хорошее увеличение скорости.
Конечно, большая часть того, что такое HotSpot.