有什么方法可以查看 JIT 在 JVM 中生成的 native 代码吗?
最佳答案
一般用法
正如其他答案所解释的,您可以使用以下 JVM 选项运行:
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
过滤特定方法
您还可以使用以下语法过滤特定方法:
-XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*MyClass.myMethod
注意事项:
- 您可能需要将第二个参数放在引号内,具体取决于操作系统等。
- 如果方法被内联,您可能会错过一些优化
如何:在 Windows 上安装所需的库
如果您运行的是 Windows,this page有关于如何构建和安装的说明hsdis-amd64.dll
和 hsdis-i386.dll
这是使其工作所必需的。我们在下面复制并扩展该页面*的内容以供引用:
从何处获取预构建的二进制文件
您可以从 fcml 下载适用于 Windows 的预构建二进制文件。项目
如何构建 hsdis-amd64.dll
和 hsdis-i386.dll
在 Windows 上
此版本的指南是在 64 位 Windows 8.1 上使用 64 位 Cygwin 并生成 hsdis-amd64.dll 编写的
Install Cygwin .在
Select Packages
屏幕,添加以下包(通过展开Devel
类别,然后单击每个包名称旁边的Skip
标签):-
make
-
mingw64-x86_64-gcc-core
(仅hsdis-amd64.dll
需要) -
mingw64-i686-gcc-core
(仅hsdis-i386.dll
需要) -
diffutils
(在Utils
类别中)
-
运行 Cygwin 终端。这可以使用安装程序创建的桌面或开始菜单图标来完成,并将创建您的 Cygwin 主目录(默认为
C:\cygwin\home\<username>\
或C:\cygwin64\home\<username>\
)。- Download the latest GNU binutils source package并将其内容提取到您的 Cygwin 主目录。在撰写本文时,最新的软件包是
binutils-2.25.tar.bz2
.这应该会产生一个名为binutils-2.25
的目录。 (或任何最新版本)在 Cygwin 主目录中。 - 通过 going to the JDK 8 Updates repository 下载 OpenJDK 源代码,选择与您安装的 JRE 版本相对应的标签,然后单击 bz2。将 hsdis 目录(位于
src\share\tools
中)解压缩到 Cygwin 主目录。 - 在 Cygwin 终端中,输入
cd ~/hsdis
. 构建
hsdis-amd64.dll
, 输入make OS=Linux MINGW=x86_64-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.25
构建
hsdis-i386.dll
, 输入make OS=Linux MINGW=i686-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.25
在任何一种情况下,替换
2.25
使用您下载的 binutils 版本。OS=Linux
是必要的,因为虽然 Cygwin 是一个类似 Linux 的环境,但 hsdis makefile 无法识别它。- 构建将失败并显示消息
./chew: No such file or directory
和gcc: command not found
.编辑<Cygwin home directory>\hsdis\build\Linux-amd64\bfd\Makefile
在 Wordpad 或 Notepad++ 等文本编辑器中更改SUBDIRS = doc po
(第 342 行,如果使用 binutils 2.25)到SUBDIRS = po
.重新运行之前的命令。
现在可以通过从 hsdis\build\Linux-amd64
复制来安装 DLL。或 hsdis\build\Linux-i586
到您的 JRE 的 bin\server
或 bin\client
目录。您可以通过搜索 java.dll
在系统上找到所有此类目录。 .
额外提示:如果您更喜欢 Intel ASM 语法而不是 AT&T,请指定 -XX:PrintAssemblyOptions=intel
与您使用的任何其他 PrintAssembly 选项一起使用。
*页面许可为知识共享
关于java - 如何在 JVM 中查看 JIT 编译的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1503479/