compiled code in JVM?

有什么方法可以查看JVM在JVM中生成的本机代码?


Assuming you're using the Sun Hotspot JVM (ie the one provided on java.com by Oracle), you can add the flag

-XX:+PrintOptoAssembly

when running your code. This will print out the optimized code generated by the JIT compiler and leaves out the rest.

If you want see the entire bytecode, including the unoptimized parts, add

-XX:CompileThreshold=#

when you're running your code.

You can read more about this command and the functionality of JIT in general here.


General usage

As explained by other answers, you can run with the following JVM options:

-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly

Filter on a specific method

You can also filter on a specific method with the following syntax:

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

Notes:

  • you might need to put the second argument within quotes depending on OS etc.
  • if the method gets inlined, you could miss some optimisations
  • How to: Install the required libraries on Windows

    If you are running Windows, this page has instructions on how to build and install hsdis-amd64.dll and hsdis-i386.dll which are required to make it work. We copy below and extend the content of that page* for reference:


    Where to get prebuilt binaries

    You can download prebuilt binaries for Windows from the fcml project

  • hsdis-amd64.dll
  • hsdis-i386.dll
  • How to build hsdis-amd64.dll and hsdis-i386.dll on Windows

    This version of the guide was prepared on Windows 8.1 64bit using 64-bit Cygwin and producing hsdis-amd64.dll

  • Install Cygwin. At the Select Packages screen, add the following packages (by expanding the Devel category, then clicking once on the Skip label next to each package name):

  • make
  • mingw64-x86_64-gcc-core (only needed for hsdis-amd64.dll )
  • mingw64-i686-gcc-core (only needed for hsdis-i386.dll )
  • diffutils (in Utils category)
  • Run the Cygwin Terminal. This can be done using the Desktop or Start Menu icon created by the installer, and will create your Cygwin home directory ( C:cygwinhome<username> or C:cygwin64home<username> by default).

  • Download the latest GNU binutils source package and extract its contents to your Cygwin home directory. At the time of writing, the latest package is binutils-2.25.tar.bz2 . This should result in a directory named binutils-2.25 (or whatever the latest version is) in your Cygwin home directory.
  • Download the OpenJDK source by going to the JDK 8 Updates repository, selecting the tag corresponding to your installed JRE version, and clicking bz2. Extract the hsdis directory (found in srcsharetools ) to your Cygwin home directory.
  • In the Cygwin Terminal, enter cd ~/hsdis .
  • To build hsdis-amd64.dll , enter

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

    To build hsdis-i386.dll , enter

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

    In either case, replace 2.25 with the binutils version you downloaded. OS=Linux is necessary because, although Cygwin is a Linux-like environment, the hsdis makefile fails to recognize it as such.

  • The build will fail with messages ./chew: No such file or directory and gcc: command not found . Edit <Cygwin home directory>hsdisbuildLinux-amd64bfdMakefile in a text editor like Wordpad or Notepad++ to change SUBDIRS = doc po (line 342, if using binutils 2.25) to SUBDIRS = po . Re-run the previous command.
  • The DLL can now be installed by copying it from hsdisbuildLinux-amd64 or hsdisbuildLinux-i586 to your JRE's binserver or binclient directory. You can find all such directories on your system by searching for java.dll .

    Bonus tip: if you prefer Intel ASM syntax to AT&T, specify -XX:PrintAssemblyOptions=intel alongside any other PrintAssembly options you use.

    *page license is Creative Commons


    You need an hsdis plugin to use PrintAssembly . A convenient choice is the hsdis plugin based on FCML library.

    It can be compiled for UNIX-like systems and on Windows you can use pre-built libraries available in the FCML download section on Sourceforge:

    To install in Windows:

  • Extract the dll (it can be found in hsdis-1.1.2-win32-i386.zip and hsdis-1.1.2-win32-amd64.zip).
  • Copy the dll to wherever exists java.dll (use Windows search). On my system, I found it at two locations:
  • C:Program FilesJavajre1.8.0_45binserver
  • C:Program FilesJavajdk1.8.0_45jrebinserver
  • To install in Linux:

  • Download source code, extract it
  • 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
  • On my system, the JDK is in /usr/lib/jvm/java-8-oracle
  • How to run it:

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

    Additional configuration parameters:

    code Print machine code before the mnemonic.
    intel Use the Intel syntax.
    gas Use the AT&T assembler syntax (GNU assembler compatible).
    dec Prints IMM and displacement as decimal values.
    mpad=XX Padding for the mnemonic part of the instruction.
    cpad=XX Padding for the machine code.
    seg Shows the default segment registers.
    zeros Show leading zeros in case of HEX literals.

    The Intel syntax is a default one in case of Windows, whereas the AT&T one is a default for the GNU/Linux.

    For more details see the FCML Library Reference Manual

    链接地址: http://www.djcxy.com/p/15184.html

    上一篇: 在Java中创建泛型类型的实例?

    下一篇: 在JVM中编译代码?