{excerpt}
Puzzled by a performance glitch? You might have to look at the generated code.
{excerpt}
h3. Examining generated code
The following HotSpot options (with an -XX: prefix on the command line) require OpenJDK 7 and an externally loadable disassembler plugin:
* {{+PrintAssembly}} print assembly code for bytecoded and native methods
* {{+PrintNMethods}} print nmethods as they are generated
* {{+PrintNativeNMethods}} print native method wrappers as they are generated
* {{+PrintSignatureHandlers}} print native method signature handlers
* {{+PrintAdapterHandlers}} print adapters (i2c, c2i) as they are generated
* {{+PrintStubCode}} print stubs: deopt, uncommon trap, exception, safepoint, runtime support
* {{+PrintInterpreter}} print interpreter code
These flags are "diagnostic", meaning that they must be preceded by {{-XX:+UnlockDiagnosticVMOptions}}. On the command line, they must all be preceded by {{-XX:}}. They may also be placed in a flags file, {{.hotspotrc}} by default, or configurable as {{-XX:Flags=myhotspotrc.txt}}.
h3. Plugin Implementations
There are 2 implementations around:
h5. OpenJDK [sources|http://hg.openjdk.java.net/jdk7/hotspot/hotspot/file/tip/src/share/tools/hsdis/] (defines the plugin API)
This version of the plugin requires the Gnu disassembler, which is available separately as part of the [binutils|http://directory.fsf.org/project/binutils] project.
Look at the [README|http://hg.openjdk.java.net/jdk7/hotspot/hotspot/file/tip/src/share/tools/hsdis/README] for instructions on building. Pre-built binaries do not seem to be available _(help... anyone?)_.
h5. Kenai project [base-hsdis|http://kenai.com/projects/base-hsdis]
This is a from-scratch implementation which uses code from the [Bastard project|http://sourceforge.net/projects/bastard] at SourceForge. The copyrights on this code are non-restrictive.
The Kenai project offers [binary downloads|http://kenai.com/projects/base-hsdis/downloads].
h3. Installing the Plugin
Once you succeed in building or downloading the {{hsdis}} binary library (in the following named DLL), you have to install it next to your libjvm.so (jvm.dll on Windows), in the same folder. (Alternatively, you can put it anywhere on your {{LD_LIBRARY_PATH}}.) The DLL must be given the name that the JVM will be looking for. The core of the name will be {{hsdis-i386}} for 32-bit Intel JVMs. Other names in use are {{hsdis-amd64}}, {{hsdis-sparc}}, and {{hsdis-sparcv9}}. A prefix and/or suffix will be required, according to system-dependent rules for naming DLLs.
{noformat:title=installing the plugin on Solaris}
$ JDK7=my/copy/of/jre1.7.0
$ cp -p hsdis/.libs/hsdis.so $JDK7/lib/i386/client/libhsdis-i386.so
$ cp -p hsdis/.libs/hsdis.so $JDK7/lib/i386/server/libhsdis-i386.so
$ XJAVA="$JDK7/bin/java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly"
$ $XJAVA -Xcomp -cp ~/Classes hello
$ $XJAVA -Xcomp -cp ~/Classes -XX:PrintAssemblyOptions=hsdis-print-bytes hello
$ $XJAVA -XX:-PrintAssembly -XX:+PrintStubCode
$ $XJAVA -XX:-PrintAssembly -XX:+PrintInterpreter
$ $XJAVA -XX:-PrintAssembly -XX:+PrintSignatureHandlers
$ $XJAVA -Xbatch -cp ~/Classes -XX:+PrintCompilation myloopingbenchmark
{noformat}
The last line (with {{myloopingbenchmark}}) is most typical, since it uses the batch execution mode common with benchmarks. The {{-XX:+PrintCompilation}} flag will let you know which (if any) methods are being compiled.
h3. Filtering Output
The {{-XX:+PrintAssembly}} option prints everything. If that's too much, drop it and use one of the following options.
Individual methods may be printed:
* {{CompileCommand=print,*MyClass.myMethod}} prints assembly for just one method
* {{CompileCommand=option,*MyClass.myMethod,PrintOptoAssembly}} (debug build only) produces the old print command output
* {{CompileCommand=option,*MyClass.myMethod,PrintNMethods}} produces method dumps
These options accumulate.
If you get no output, use {{-XX:+PrintCompilation}} to verify that your method is getting compiled at all.
h3. Reading the compiler's mind
The {{-XX:+LogCompilation}} flag produces a low-level XML file about compiler and runtime decisions, which may be interesting to some. The {{-XX:+UnlockDiagnosticVMOptions}} must come first. The dump is to {{hotspot.log}} in the current directory; use {{-XX:LogFile=foo.log}} to change this.
Puzzled by a performance glitch? You might have to look at the generated code.
{excerpt}
h3. Examining generated code
The following HotSpot options (with an -XX: prefix on the command line) require OpenJDK 7 and an externally loadable disassembler plugin:
* {{+PrintAssembly}} print assembly code for bytecoded and native methods
* {{+PrintNMethods}} print nmethods as they are generated
* {{+PrintNativeNMethods}} print native method wrappers as they are generated
* {{+PrintSignatureHandlers}} print native method signature handlers
* {{+PrintAdapterHandlers}} print adapters (i2c, c2i) as they are generated
* {{+PrintStubCode}} print stubs: deopt, uncommon trap, exception, safepoint, runtime support
* {{+PrintInterpreter}} print interpreter code
These flags are "diagnostic", meaning that they must be preceded by {{-XX:+UnlockDiagnosticVMOptions}}. On the command line, they must all be preceded by {{-XX:}}. They may also be placed in a flags file, {{.hotspotrc}} by default, or configurable as {{-XX:Flags=myhotspotrc.txt}}.
h3. Plugin Implementations
There are 2 implementations around:
h5. OpenJDK [sources|http://hg.openjdk.java.net/jdk7/hotspot/hotspot/file/tip/src/share/tools/hsdis/] (defines the plugin API)
This version of the plugin requires the Gnu disassembler, which is available separately as part of the [binutils|http://directory.fsf.org/project/binutils] project.
Look at the [README|http://hg.openjdk.java.net/jdk7/hotspot/hotspot/file/tip/src/share/tools/hsdis/README] for instructions on building. Pre-built binaries do not seem to be available _(help... anyone?)_.
h5. Kenai project [base-hsdis|http://kenai.com/projects/base-hsdis]
This is a from-scratch implementation which uses code from the [Bastard project|http://sourceforge.net/projects/bastard] at SourceForge. The copyrights on this code are non-restrictive.
The Kenai project offers [binary downloads|http://kenai.com/projects/base-hsdis/downloads].
h3. Installing the Plugin
Once you succeed in building or downloading the {{hsdis}} binary library (in the following named DLL), you have to install it next to your libjvm.so (jvm.dll on Windows), in the same folder. (Alternatively, you can put it anywhere on your {{LD_LIBRARY_PATH}}.) The DLL must be given the name that the JVM will be looking for. The core of the name will be {{hsdis-i386}} for 32-bit Intel JVMs. Other names in use are {{hsdis-amd64}}, {{hsdis-sparc}}, and {{hsdis-sparcv9}}. A prefix and/or suffix will be required, according to system-dependent rules for naming DLLs.
{noformat:title=installing the plugin on Solaris}
$ JDK7=my/copy/of/jre1.7.0
$ cp -p hsdis/.libs/hsdis.so $JDK7/lib/i386/client/libhsdis-i386.so
$ cp -p hsdis/.libs/hsdis.so $JDK7/lib/i386/server/libhsdis-i386.so
$ XJAVA="$JDK7/bin/java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly"
$ $XJAVA -Xcomp -cp ~/Classes hello
$ $XJAVA -Xcomp -cp ~/Classes -XX:PrintAssemblyOptions=hsdis-print-bytes hello
$ $XJAVA -XX:-PrintAssembly -XX:+PrintStubCode
$ $XJAVA -XX:-PrintAssembly -XX:+PrintInterpreter
$ $XJAVA -XX:-PrintAssembly -XX:+PrintSignatureHandlers
$ $XJAVA -Xbatch -cp ~/Classes -XX:+PrintCompilation myloopingbenchmark
{noformat}
The last line (with {{myloopingbenchmark}}) is most typical, since it uses the batch execution mode common with benchmarks. The {{-XX:+PrintCompilation}} flag will let you know which (if any) methods are being compiled.
h3. Filtering Output
The {{-XX:+PrintAssembly}} option prints everything. If that's too much, drop it and use one of the following options.
Individual methods may be printed:
* {{CompileCommand=print,*MyClass.myMethod}} prints assembly for just one method
* {{CompileCommand=option,*MyClass.myMethod,PrintOptoAssembly}} (debug build only) produces the old print command output
* {{CompileCommand=option,*MyClass.myMethod,PrintNMethods}} produces method dumps
These options accumulate.
If you get no output, use {{-XX:+PrintCompilation}} to verify that your method is getting compiled at all.
h3. Reading the compiler's mind
The {{-XX:+LogCompilation}} flag produces a low-level XML file about compiler and runtime decisions, which may be interesting to some. The {{-XX:+UnlockDiagnosticVMOptions}} must come first. The dump is to {{hotspot.log}} in the current directory; use {{-XX:LogFile=foo.log}} to change this.