Как узнать, какие оптимизации JVM применила к моему коду? - PullRequest
10 голосов
/ 08 сентября 2010

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

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

Ответы [ 4 ]

6 голосов
/ 08 сентября 2010

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

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

  • Клиентская JVM: если метод эффективно final (нет ни одного загруженного класса, который переопределяет его),JVM использует не виртуальный вызов.Впоследствии, если вы загрузите класс, который переопределяет этот метод, 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
    }

Если вы действительно заинтересованы в просмотре сгенерированного кода, вы можете поиграть с JVM DEBUG из OpenJDK:

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

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

4 голосов
/ 08 сентября 2010

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

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

3 голосов
/ 08 сентября 2010

Следующее является очень хорошим ресурсом:

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

Особенно интересны ссылки "Инструмент LogCompilation" и "Обзор LogCompilation" (я не могу публиковать прямые ссылки, поскольку я 'Мы только что зарегистрировались).

2 голосов
/ 08 сентября 2010

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

...