Как узнать, какие оптимизации JVM применила к моему коду?
-
01-10-2019 - |
Вопрос
JVM (особенно HotSpot VM) славится огромным количеством оптимизаций, которые она может применять во время выполнения.
Есть ли способ взглянуть на определенный фрагмент кода и посмотреть, что на самом деле сделала с ним JVM?
Решение
Одна из проблем заключается в том, что "то, что JVM на самом деле с этим сделала", меняется между вызовами, поскольку JVM может повторно генерировать код.
В качестве примера я исследовал несколько дней назад, что Hotspot делает с final
методы по сравнению с виртуальными методами.Судя по микробенчмаркам, мои выводы были следующими:
Клиентская JVM:Если метод является эффективно
final
(нет ни одного загруженного класса, который переопределял бы его), JVM использует невиртуальный вызов.Впоследствии, если вы загрузите класс, который переопределяет этот метод, JVM изменит JIT'ed код, чтобы сделать вызовы виртуальными.Итак, объявляя какfinal
не имеет существенного значения.Сервер JVM:Здесь
final
похоже, это тоже не имеет никакого отношения к делу.Похоже, что происходит то, что JVM генерирует невиртуальный вызов для любого класса, который вы используете в первый раз, независимо от того, какие классы загружены.Впоследствии, если вы выполняете вызов из объекта другого класса, JVM исправит все вызовы чем-то подобным этому (я предполагаю, что он также будет профилировать вызовы, чтобы он мог изменять быстрый путь и медленный путь, если он не понял это правильно с первого раза):
if (object instanceof ClassOfNonVirtualCall) { do non-virtual call to ClassOfNonVirtualCall.method } else { do virtual call to object.method }
Если вам действительно интересно увидеть сгенерированный код, вы можете поиграть с отладочными JVMS из OpenJDK:
Другие советы
Это очень часто JVM, и вам, скорее всего, нужно будет делать серьезное расследование в конкретном JVM, на котором вы смотрите.
Вы можете увидеть доступные варианты VM Hotspot здесь http://www.orcle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html.
Ниже приведен очень хороший ресурс:
http://wikis.sun.com/display/hotspotinternals/home.
Особенно интересными являются «инструмент« LogComPilation »и« Обзор «Обзор« logCompilation »(не может опубликовать прямые ссылки, как я только что зарегистрирован).
Вот хорошая страница на Оптимизация горячей точкиОтказ Некоторые из оптимизаций можно увидеть, глядя на Bytecode, испускаемый компилятором. Другие оптимизации динамичны и существуют только во время выполнения. Например, точка доступа может сделать Замена на стек которые изменяют стек непосредственно во время выполнения.