Jak zobaczyć skompilowany kod JIT w JVM?

Czy Jest jakiś sposób, aby zobaczyć natywny kod wytwarzany przez JIT w JVM?

Author: assylias, 2009-10-01

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 .

 39
Author: Falaina,
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

  1. Zainstaluj Cygwin . Na ekranie Select Packages dodaj następujące pakiety (rozwijając kategorię Devel, a następnie klikając raz na etykiecie Skip obok każdego pakietu nazwa):

    • make
    • mingw64-x86_64-gcc-core (potrzebne tylko dla hsdis-amd64.dll)
    • mingw64-i686-gcc-core (potrzebne tylko dla hsdis-i386.dll)
    • diffutils (w kategorii Utils)
  2. 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>\ lub C:\cygwin64\home\<username>\ domyślnie).

  3. 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 katalogu binutils-2.25 (lub dowolnej najnowszej wersji) w katalogu domowym Cygwin.
  4. 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.
  5. W Terminalu Cygwin wpisz cd ~/hsdis.
  6. Aby zbudować hsdis-amd64.dll, wpisz

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

    Aby zbudować hsdis-i386.dll, wpisz

    make 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.

  7. budowa zakończy się niepowodzeniem z wiadomościami ./chew: No such file or directory i gcc: 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) do SUBDIRS = 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

 64
Author: assylias,
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

 24
Author: swojtasiak,
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.

 8
Author: John Rose,
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 got

    00402f68 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.

 5
Author: Andriy Tkach,
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.

 4
Author: Ian,
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.

 0
Author: Aleksandr Dubinsky,
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