Вопрос-ответ

How to see JIT-compiled code in JVM?

Как увидеть JIT-скомпилированный код в JVM?

Есть ли какой-нибудь способ увидеть машинный код, создаваемый JIT в JVM?

Переведено автоматически
Ответ 1

Общее использование

Как объясняется в других ответах, вы можете работать со следующими параметрами JVM:

-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly

Фильтр по определенному методу

Вы также можете выполнить фильтрацию по определенному методу со следующим синтаксисом:

-XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*MyClass.myMethod

Примечания:


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

  • если метод будет встроен, вы можете пропустить некоторые оптимизации

Как: Установить необходимые библиотеки в Windows

Если вы используете Windows, на этой странице приведены инструкции по сборке и установке, hsdis-amd64.dll и hsdis-i386.dll что требуется для того, чтобы это заработало. Мы копируем ниже и расширяем содержимое этой страницы * для справки:


Где получить готовые двоичные файлы

Вы можете загрузить готовые двоичные файлы для Windows из проекта fcml

Как создавать hsdis-amd64.dll и hsdis-i386.dll в Windows

Эта версия руководства была подготовлена для 64-разрядной Windows 8.1 с использованием 64-разрядного Cygwin и производящей hsdis-amd64.dll


  1. Установите Cygwin. На Select Packages экране добавьте следующие пакеты (развернув Devel категорию, затем щелкнув один раз на Skip ярлыке рядом с именем каждого пакета):



    • make

    • mingw64-x86_64-gcc-core (требуется только для hsdis-amd64.dll)

    • mingw64-i686-gcc-core (требуется только для hsdis-i386.dll)

    • diffutilsUtils категории)


  2. Запустите терминал Cygwin. Это можно сделать с помощью значка рабочего стола или меню "Пуск", созданного установщиком, и он создаст ваш домашний каталог Cygwin (C:\cygwin\home\<username>\ или C:\cygwin64\home\<username>\ по умолчанию).


  3. Загрузите последний исходный пакет GNU binutils и извлеките его содержимое в свой домашний каталог Cygwin. На момент написания статьи последним пакетом является binutils-2.25.tar.bz2. Результатом должно стать создание каталога с именем binutils-2.25 (или любой другой последней версии) в вашем домашнем каталоге Cygwin.

  4. Загрузите исходный код OpenJDK, перейдя в репозиторий обновлений JDK 8, выбрав тег, соответствующий установленной вами версии JRE, и нажав bz2. Извлеките каталог hsdis (находится в src\share\tools) в ваш домашний каталог Cygwin.

  5. В терминале Cygwin введите cd ~/hsdis.

  6. Для сборки hsdis-amd64.dll введите


    make OS=Linux MINGW=x86_64-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.25


    Для сборки hsdis-i386.dll введите


    make OS=Linux MINGW=i686-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.25


    В любом случае замените 2.25 на версию binutils, которую вы скачали. OS=Linux это необходимо, потому что, хотя Cygwin является Linux-подобной средой, файл hsdis makefile не распознает его как таковой.


  7. Сборка завершится ошибкой с сообщениями ./chew: No such file or directory и gcc: command not found. Отредактируйте <Cygwin home directory>\hsdis\build\Linux-amd64\bfd\Makefile в текстовом редакторе, таком как Wordpad или Notepad ++, чтобы изменить SUBDIRS = doc po (строка 342, если используется binutils 2.25) на SUBDIRS = po. Повторно запустите предыдущую команду.

Теперь библиотеку DLL можно установить, скопировав ее из hsdis\build\Linux-amd64 или hsdis\build\Linux-i586 в каталог bin\server or bin\client вашей JRE. Вы можете найти все такие каталоги в вашей системе, выполнив поиск по java.dll.

Бонусный совет: если вы предпочитаете синтаксис Intel ASM AT & T, укажите -XX:PrintAssemblyOptions=intel наряду с любыми другими параметрами PrintAssembly, которые вы используете.

* лицензия на страницу Creative Commons

Ответ 2

Предполагая, что вы используете JVM Sun Hotspot (то есть ту, которая предоставляется на java.com Oracle), вы можете добавить флаг


-XX:+PrintOptoAssembly


при запуске вашего кода. При этом будет распечатан оптимизированный код, сгенерированный JIT-компилятором, без учета остального.

Если вы хотите увидеть весь байт-код, включая неоптимизированные части, добавьте


-XX:CompileThreshold =#


когда вы запускаете свой код.

Вы можете прочитать больше об этой команде и функциональности JIT в целом здесь.

Ответ 3

Для использования вам нужен плагин hsdis PrintAssembly. Удобный выбор - плагин hsdis, основанный на библиотеке FCML.

Он может быть скомпилирован для UNIX-подобных систем, а в Windows вы можете использовать готовые библиотеки, доступные в разделе "Загрузка FCML" на Sourceforge:

Для установки в Windows:


  • Извлеките dll (ее можно найти в hsdis-1.1.2-win32-i386.zip и hsdis-1.1.2-win32-amd64.zip).

  • Скопируйте dll туда, где она существует java.dll (используйте поиск Windows). В моей системе я нашел ее в двух местах:

    • C:\Program Files\Java\jre1.8.0_45\bin\server

    • C:\Program Files\Java\jdk1.8.0_45\jre\bin\server


Для установки в Linux:


  • Загрузите исходный код, извлеките его

  • cd <source code dir>

  • ./configure && make && sudo make install

  • cd example/hsdis && make && sudo make install

  • sudo ln -s /usr/local/lib/libhsdis.so <JDK PATH>/lib/amd64/hsdis-amd64.so

  • sudo ln -s /usr/local/lib/libhsdis.so <JDK PATH>/jre/lib/amd64/hsdis-amd64.so

  • В моей системе JDK находится в /usr/lib/jvm/java-8-oracle

Как его запустить:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly 
-XX:+LogCompilation -XX:PrintAssemblyOptions=intel,mpad=10,cpad=10,code
-jar fcml-test.jar

Дополнительные параметры конфигурации:

code Выводит машинный код перед мнемоникой.

intel Использует синтаксис Intel.

gas Использует синтаксис ассемблера AT & T (совместим с GNU assembler).

dec Выводит IMM и displacement в виде десятичных значений.

mpad=XX Заполнение мнемонической части инструкции.

cpad= XX Заполнение машинного кода.

seg Показывает сегментные регистры по умолчанию.

нули Показывают начальные нули в случае шестнадцатеричных литералов.

Синтаксис Intel используется по умолчанию в случае Windows, тогда как синтаксис AT & T используется по умолчанию в GNU / Linux.

Более подробную информацию смотрите в Справочном руководстве по библиотеке FCML

Ответ 4

Для JVM HotSpot (была Sun), даже в режимах продукта:

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

Требуется некоторая сборка: для нее нужен плагин.

java jvm