10

JVM (особенно HotSpot VM) славится тем, что имеет огромное количество оптимизаций, которые могут применяться во время выполнения.Как узнать, какие оптимизации JVM применил к моему коду?

Есть ли способ взглянуть на определенный фрагмент кода и посмотреть, что на самом деле сделала JVM?

ответ

6

Одна проблема заключается в том, что «то, что JVM фактически сделал для него» изменений между вызовами как JVM волен повторно генерировать код.

В качестве примера я несколько дней назад исследовал, что Hotspot делает с final методами по сравнению с виртуальными методами. Судя по microbenchmarks, мои выводы были:

  • Клиента JVM: Если метод эффективноfinal (нет никакого загруженного класса, который перекрывает его), виртуальная машина использует невиртуальный вызов. Впоследствии, если вы загружаете класс, который переопределяет этот метод, JVM изменит код JIT, чтобы сделать виртуальные вызовы. Поэтому объявление final не имеет существенной значимости.

  • Сервер JVM: здесь final также не имеет отношения. Кажется, что JVM генерирует не виртуальный вызов для любого класса, в котором вы используете в первый раз, независимо от того, какие классы загружены. Впоследствии, если вы сделаете вызов с объекта другого класса, JVM будет исправлять все вызовы с чем-то похожим на это (я думаю, что он будет также выполнять профильные вызовы, чтобы он мог изменять быстрый и медленный путь, если он не получил это право в первый раз):

 
    if (object instanceof ClassOfNonVirtualCall) { 
     do non-virtual call to ClassOfNonVirtualCall.method 
    } else { 
     do virtual call to object.method 
    } 

Если вы действительно заинтересованы в том, чтобы сгенерированный код, вы можете играть с DEBUG от OpenJDK виртуальных машинах:

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

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

+0

Действительно, VM будет встроен специальный код для двух классов - биморфная вставка. Я считаю, что эта функция была реализована для поддержки NIO direct и Java heap buffers. –

4

Это очень специфичный JVM, и вам, скорее всего, потребуется провести серьезное исследование в конкретной JVM, на которую вы смотрите.

Вы можете увидеть доступные варианты HotSpot VM здесь http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

+0

Точка доступа будет реализацией JVM. Меня интересует. – soc

3

Следующая очень хороший ресурс:

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

Особенно интересными являются «LogCompilation инструмент» и «Обзор» LogCompilation ссылки (не могут оставлять прямые ссылки, как я только что зарегистрировался).

+0

Hi ijuma! Рад видеть тебя здесь! – soc

2

Хорошая страница на HotSpot optimizations. Некоторые из оптимизаций можно увидеть, посмотрев на байт-код, испускаемый компилятором. Другие оптимизации являются динамическими и существуют только во время выполнения. Например, HotSpot может делать on-stack replacement, который изменяет стек непосредственно во время выполнения.

 Смежные вопросы

  • Нет связанных вопросов^_^