Вопрос

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:

http://dlc.sun.com.edgesuite.net/jdk7/binaries/index.html

http://wikis.sun.com/display/HotSpotInternals/PrintAssembly

Другие советы

Это очень часто 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, испускаемый компилятором. Другие оптимизации динамичны и существуют только во время выполнения. Например, точка доступа может сделать Замена на стек которые изменяют стек непосредственно во время выполнения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top