Как увидеть 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
Установите Cygwin. На
Select Packages
экране добавьте следующие пакеты (развернувDevel
категорию, затем щелкнув один раз наSkip
ярлыке рядом с именем каждого пакета):make
mingw64-x86_64-gcc-core
(требуется только дляhsdis-amd64.dll
)mingw64-i686-gcc-core
(требуется только дляhsdis-i386.dll
)diffutils
(вUtils
категории)
Запустите терминал Cygwin. Это можно сделать с помощью значка рабочего стола или меню "Пуск", созданного установщиком, и он создаст ваш домашний каталог Cygwin (
C:\cygwin\home\<username>\
илиC:\cygwin64\home\<username>\
по умолчанию).- Загрузите последний исходный пакет GNU binutils и извлеките его содержимое в свой домашний каталог Cygwin. На момент написания статьи последним пакетом является
binutils-2.25.tar.bz2
. Результатом должно стать создание каталога с именемbinutils-2.25
(или любой другой последней версии) в вашем домашнем каталоге Cygwin. - Загрузите исходный код OpenJDK, перейдя в репозиторий обновлений JDK 8, выбрав тег, соответствующий установленной вами версии JRE, и нажав bz2. Извлеките каталог hsdis (находится в
src\share\tools
) в ваш домашний каталог Cygwin. - В терминале Cygwin введите
cd ~/hsdis
. Для сборки
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 не распознает его как таковой.- Сборка завершится ошибкой с сообщениями
./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
Требуется некоторая сборка: для нее нужен плагин.