如何在 JVM HotSpot 中使用 -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print 选项
问题描述
我正在尝试使用 -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*MyClass.myMethod 命令行questions/9336704/jvm-option-to-optimize-loop-statements#answer-9337542">这篇文章.
它似乎可以通过 open-jdk (https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly).
如何在 oracle JDK7 和 JVM HotSpot 中使用这些选项(或类似选项)?
解决方案
这些说明适用于 Linux (Ubuntu 10.04.4 LTS),但应该适用于您的操作系统.下载 Oracle JDK 7u3 并适当地设置你的
JAVA_HOME
和 PATH
环境变量,执行以下检查可用的选项:
java -XX:+AggressiveOpts -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version
您应该看到
UnlockDiagnosticVMOptions
、CompileCommand
和 PrintAssembly
选项可用.使用 CompileCommand
选项也将启用 PrintAssembly
选项.但是,您需要 HotSpot 反汇编器插件才能使 PrintAssembly
工作;如果没有它,您可能会看到如下内容:
$ java -versionjava版本1.7.0_03"Java(TM) SE 运行时环境 (build 1.7.0_03-b04)Java HotSpot(TM) 服务器虚拟机(build 22.1-b02,混合模式)$ java -server -XX:+UnlockDiagnosticVMOptions '-XX:CompileCommand=print,*Main.main' Main编译器Oracle:打印 *Main.mainJava HotSpot(TM) 服务器虚拟机警告:汇编代码打印已启用;打开 DebugNonSafepoints 以获得额外的输出编译方法 (c2) 68 1 % Main::main @ 4 (49 字节)堆中的总数 [0xb3a97548,0xb3a979ec] = 1188重定位 [0xb3a97610,0xb3a97624] = 20主代码 [0xb3a97640,0xb3a97840] = 512存根代码 [0xb3a97840,0xb3a97850] = 16哎呀 [0xb3a97850,0xb3a97858] = 8范围数据 [0xb3a97858,0xb3a97898] = 64范围 pcs [0xb3a97898,0xb3a979e8] = 336依赖项 [0xb3a979e8,0xb3a979ec] = 4无法加载 hsdis-i386.so;库不可加载;PrintAssembly 已禁用OopMapSet 包含 1 个 OopMaps
要获得 HotSpot 反汇编插件,您需要构建它.查看 OpenJDK 7u2 源代码,hsdis 插件自述文件 说:
<块引用>要将插件与 JVM 一起使用,您需要一个可以加载它的新版本.如果你的 JVM 的产品模式不接受 -XX:+PrintAssembly,您没有足够新的版本.
要构建这个项目,您 [需要] 一份 GNU binutils 的副本来构建.
理论上,这应该可以在 Windows 上构建,但可以正常工作事实证明,Windows 上的 GNU 构建环境很困难.
我们已经在上面确认了 Oracle JDK 7u3 支持 PrintAssembly
.我按照 hsdis 插件自述文件的说明,下载了 GNU binutils 2.22,将其放在 hsdis build/binutils
目录中,然后运行 make
.这最终产生了以下错误:
为了纠正这个问题,我使用以下补丁更改了 hsdis.c:
运行
p>make
然后成功.现在只需将hsdis build
目录下的hsdis-i386.so
插件复制到Oracle JDK 7u3 jre/lib/i386
目录下即可.
现在可以看到反汇编的编译代码了:
我用过的测试类是:
I 'm trying to use -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*MyClass.myMethod
command lines as described in this post.
It seems thats it's available with open-jdk
(https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly).
How can I use those options (or similar equivalents) with oracle JDK7 and the JVM HotSpot?
These instructions apply to Linux (Ubuntu 10.04.4 LTS), but should be applicable for your OS. After downloading Oracle JDK 7u3 and appropriately setting your JAVA_HOME
and PATH
environment variables, execute the following to check available options:
You should see the UnlockDiagnosticVMOptions
, CompileCommand
and PrintAssembly
options are available. Using the CompileCommand
option will also enable the PrintAssembly
option. However, you will need the HotSpot disassembler plugin for PrintAssembly
to work; without it, you might see something like the following:
To get the HotSpot disassembler plugin, you will need to build it. Looking at the OpenJDK 7u2 source, the hsdis plugin readme says:
To use the plugin with a JVM, you need a new version that can load it. If the product mode of your JVM does not accept -XX:+PrintAssembly, you do not have a version that is new enough.
To build this project you [need] a copy of GNU binutils to build against.
In theory this should be buildable on Windows but getting a working GNU build environment on Windows has proven difficult.
We have confirmed above that Oracle JDK 7u3 supports PrintAssembly
. I followed the hsdis plugin readme instructions, downloaded GNU binutils 2.22, placed it in the hsdis build/binutils
directory and ran make
. This eventually produced the following error:
To correct this, I changed hsdis.c using the following patch:
Running make
was then successful. Now just copy the hsdis-i386.so
plugin in the hsdis build
directory to the Oracle JDK 7u3 jre/lib/i386
directory.
Now you can see the disassembled compiled code:
The test class I've used is:
这篇关于如何在 JVM HotSpot 中使用 -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print 选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!