Jak zobaczyć skompilowany kod JIT w JVM?
Czy Jest jakiś sposób, aby zobaczyć natywny kod wytwarzany przez JIT w JVM?
7 answers
Zakładając, że używasz Sun Hotspot JVM (tj. tego podanego na java.com przez Oracle), możesz dodać flagę
- XX: + PrintOptoAssembly
Podczas uruchamiania kodu. Spowoduje to wydrukowanie zoptymalizowanego kodu wygenerowanego przez kompilator JIT i pominięcie reszty.
Jeśli chcesz zobaczyć cały kod bajtowy, łącznie z nieoptymowanymi częściami, dodaj
- XX: CompileThreshold= #
Kiedy uruchamiasz swój kod.
Możesz więcej informacji na temat tej komendy i funkcjonalności JIT w ogóle tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 17:19:29
Ogólne użycie
Jak wyjaśniono w innych odpowiedziach, możesz uruchomić z następującymi opcjami JVM:
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
Filtr na konkretną metodę
Można również filtrować według określonej metody z następującą składnią:
-XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*MyClass.myMethod
Uwagi:
- może być konieczne umieszczenie drugiego argumentu w cudzysłowach w zależności od systemu operacyjnego itp. Jeśli metoda zostanie zainlinowana, możesz pominąć kilka optymalizacji]}
Jak: zainstalować wymagane biblioteki na Windows
Jeśli używasz systemu Windows, ta strona zawiera instrukcje, jak zbudować i zainstalować hsdis-amd64.dll
i hsdis-i386.dll
, które są wymagane, aby to działało. Kopiujemy poniżej i rozszerzamy zawartość tej strony* w celach informacyjnych:
Skąd wziąć gotowe pliki binarne
Możesz pobrać gotowe pliki binarne Dla Windows z fcml projekt
Jak zbudować hsdis-amd64.dll
i hsdis-i386.dll
w systemie Windows
Ta wersja przewodnika została przygotowana na Windows 8.1 64bit przy użyciu 64-bitowego Cygwina i produkcji hsdis-amd64.dll
-
Zainstaluj Cygwin . Na ekranie
Select Packages
dodaj następujące pakiety (rozwijając kategorięDevel
, a następnie klikając raz na etykiecieSkip
obok każdego pakietu nazwa):make
-
mingw64-x86_64-gcc-core
(potrzebne tylko dlahsdis-amd64.dll
) -
mingw64-i686-gcc-core
(potrzebne tylko dlahsdis-i386.dll
) -
diffutils
(w kategoriiUtils
)
Uruchom terminal Cygwin. Można to zrobić za pomocą ikony pulpitu lub menu Start utworzonej przez instalator i utworzy Twój katalog domowy Cygwin (
C:\cygwin\home\<username>\
lubC:\cygwin64\home\<username>\
domyślnie).-
Pobierz najnowszy pakiet źródłowy GNU binutils i rozpakuj jego zawartość do domu Cygwin katalog. W chwili pisania tego tekstu najnowszym pakietem jest
binutils-2.25.tar.bz2
. Powinno to skutkować utworzeniem katalogubinutils-2.25
(lub dowolnej najnowszej wersji) w katalogu domowym Cygwin. - Pobierz źródło OpenJDK przez przechodząc do repozytorium aktualizacji JDK 8, wybierając znacznik odpowiadający zainstalowanej wersji JRE i klikając bz2. Rozpakuj katalog hsdis (znaleziony w
src\share\tools
) do katalogu domowego Cygwin. - W Terminalu Cygwin wpisz
cd ~/hsdis
. -
Aby zbudować
hsdis-amd64.dll
, wpiszmake OS=Linux MINGW=x86_64-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.25
Aby zbudować
hsdis-i386.dll
, wpiszmake OS=Linux MINGW=i686-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.25
W obu przypadkach zastąp
2.25
pobraną wersją binutils.OS=Linux
jest konieczne, ponieważ chociaż Cygwin jest środowiskiem podobnym do Linuksa, plik Makefile hsdis nie rozpoznaje go jako takiego. - budowa zakończy się niepowodzeniem z wiadomościami
./chew: No such file or directory
igcc: command not found
. Edytuj<Cygwin home directory>\hsdis\build\Linux-amd64\bfd\Makefile
w edytorze tekstu, takim jak WordPad lub Notepad++, aby zmienićSUBDIRS = doc po
(linia 342, jeśli używając binutils 2.25) doSUBDIRS = po
. Uruchom ponownie poprzednie polecenie.
DLL można teraz zainstalować kopiując go z hsdis\build\Linux-amd64
lub hsdis\build\Linux-i586
do katalogu JRE bin\server
lub bin\client
. Możesz znaleźć wszystkie takie katalogi w swoim systemie, wyszukując java.dll
.
Wskazówka dodatkowa: jeśli wolisz składnię Intel ASM od AT & T, podaj -XX:PrintAssemblyOptions=intel
wraz z innymi opcjami PrintAssembly, których używasz.
*licencja strony to Creative Commons
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 23:16:19
Do korzystania z PrintAssembly
potrzebna jest wtyczka hsdis. Wygodnym wyborem jest wtyczka hsdis oparta na bibliotece FCML.
Może być skompilowany dla systemów uniksopodobnych, a w systemie Windows można użyć gotowych bibliotek dostępnych w sekcji fcml download na Sourceforge:
Aby zainstalować w systemie Windows:
- Rozpakuj bibliotekę dll (można ją znaleźć w hsdis-1.1.2-win32-i386.zip i hsdis-1.1.2-win32-amd64.zip).
- skopiuj bibliotekę dll tam, gdzie istnieje
java.dll
(Użyj Windows Szukaj). W moim systemie znalazłem go w dwóch miejscach:C:\Program Files\Java\jre1.8.0_45\bin\server
C:\Program Files\Java\jdk1.8.0_45\jre\bin\server
Aby zainstalować w Linuksie:
- Pobierz kod źródłowy, wyodrębnij go
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
- w moim systemie JDK jest w
/usr/lib/jvm/java-8-oracle
Jak go uruchomić:
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
-XX:+LogCompilation -XX:PrintAssemblyOptions=intel,mpad=10,cpad=10,code
-jar fcml-test.jar
Dodatkowe parametry konfiguracyjne:
code Drukuj Kod maszyny przed mnemonic.
intel użyj składni Intela.
gas używa składni asemblera AT&T (zgodnej z asemblerem GNU).
Dec wyświetla IMM i przesunięcie jako wartości dziesiętne.
mpad=XX wypełnienie dla mnemonicznej części instrukcji.
CPAD=XX wypełnianie kodu maszynowego.
seg pokazuje domyślne rejestry segmentów.
zera pokazują początkowe zera w przypadku liter szesnastkowych.
Składnia Intela jest domyślna w przypadku Windows, podczas gdy AT & T jest domyślna dla GNU/Linuksa.
Więcej szczegółów można znaleźć w Fcml Library Reference Manual
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-26 19:41:50
Dla hotspota (was Sun) JVM, nawet w trybach produktu:
Http://wikis.oracle.com/display/HotSpotInternals/PrintAssembly
Wymagany montaż: wymaga wtyczki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-21 13:26:12
Uważam, że WinDbg byłby pomocny, jeśli używasz go na komputerze z systemem windows. Mam tylko jeden słoik.
- Następnie dołączyłem do procesu java przez Windbg
- zbadane wątki przez ~ polecenie; było 11 wątków, 0 wątków było głównym wątkiem roboczym
- Switched to 0-thread - ~0s
-
Przeglądałem unmanmaged callstack przez kb było:
0008fba8 7c90e9c0 ntdll!KiFastSystemCallRet
0008fbac 7c8025cb ntdll!ZwWaitForSingleObject+0xc
0008fc10 7c802532WaitForSingleObjectEx+0xa8
0008fc24 00403a1332!WaitForSingleObject+0x12
0008fc40 00402f68 java+0x3a13
0008fee4 004087b8 java + 0x2f68
0008ffc0 7c816fd7 java + 0x87b8
0008fff0 0000000032!BaseProcessStart+0x23
Podświetlone linie to bezpośrednie uruchamianie kodu JIT-ed w JVM.
Następnie możemy poszukać adresu metody:
java + 0x2f68 is 00402f68-
Na WinDBG:
Kliknij View --> Demontaż.
Kliknij edytuj -- > Przejdź do Adres.
umieść 00402f68 tam
I got00402f68 55 push ebp
00402f69 8bec mov ebp, esp
00402f6b 81ec80020000 sub esp, 280h
00402f71 53 push ebx
00402f72 56 push esi
00402f73 57 push edi
... i tak on
Aby uzyskać dodatkowe informacje tutaj jest przykład jak prześledzić kod JIT-ed z zrzutów pamięci za pomocą process explorer i WinDbg.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 13:20:01
Innym sposobem wyświetlania kodu maszynowego i niektórych danych o wydajności jest użycie CodeAnalyst lub OProfile firmy AMD, które mają wtyczkę Java do wizualizacji kodu Javy jako kodu maszynowego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-10 22:23:22
Wydrukuj zespół swoich hotspotów za pomocą profilerów perfasm JMH (LinuxPerfAsmProfiler
LUB WinPerfAsmProfiler
). JMH wymaga biblioteki hsdis
, ponieważ opiera się na PrintAssembly
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-01 15:34:12