java - 如何在 JVM 中查看 JIT 编译的代码?

标签 java assembly jvm jit

有什么方法可以查看 JIT 在 JVM 中生成的 native 代码吗?

最佳答案

一般用法

正如其他答案所解释的,您可以使用以下 JVM 选项运行:

-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly

过滤特定方法

您还可以使用以下语法过滤特定方法:

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

注意事项:

  • 您可能需要将第二个参数放在引号内,具体取决于操作系统等。
  • 如果方法被内联,您可能会错过一些优化

如何:在 Windows 上安装所需的库

如果您运行的是 Windows,this page有关于如何构建和安装的说明hsdis-amd64.dllhsdis-i386.dll这是使其工作所必需的。我们在下面复制并扩展该页面*的内容以供引用:


从何处获取预构建的二进制文件

您可以从 fcml 下载适用于 Windows 的预构建二进制文件。项目

如何构建 hsdis-amd64.dllhsdis-i386.dll在 Windows 上

此版本的指南是在 64 位 Windows 8.1 上使用 64 位 Cygwin 并生成 hsdis-amd64.dll 编写的

  1. Install Cygwin .在 Select Packages屏幕,添加以下包(通过展开 Devel 类别,然后单击每个包名称旁边的 Skip 标签):

    • make
    • mingw64-x86_64-gcc-core (仅 hsdis-amd64.dll 需要)
    • mingw64-i686-gcc-core (仅 hsdis-i386.dll 需要)
    • diffutils (在 Utils 类别中)
  2. 运行 Cygwin 终端。这可以使用安装程序创建的桌面或开始菜单图标来完成,并将创建您的 Cygwin 主目录(默认为 C:\cygwin\home\<username>\C:\cygwin64\home\<username>\)。

  3. Download the latest GNU binutils source package并将其内容提取到您的 Cygwin 主目录。在撰写本文时,最新的软件包是 binutils-2.25.tar.bz2 .这应该会产生一个名为 binutils-2.25 的目录。 (或任何最新版本)在 Cygwin 主目录中。
  4. 通过 going to the JDK 8 Updates repository 下载 OpenJDK 源代码,选择与您安装的 JRE 版本相对应的标签,然后单击 bz2。将 hsdis 目录(位于 src\share\tools 中)解压缩到 Cygwin 主目录。
  5. 在 Cygwin 终端中,输入 cd ~/hsdis .
  6. 构建 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 无法识别它。

  7. 构建将失败并显示消息 ./chew: No such file or directorygcc: 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\serverbin\client目录。您可以通过搜索 java.dll 在系统上找到所有此类目录。 .

额外提示:如果您更喜欢 Intel ASM 语法而不是 AT&T,请指定 -XX:PrintAssemblyOptions=intel与您使用的任何其他 PrintAssembly 选项一起使用。

*页面许可为知识共享

关于java - 如何在 JVM 中查看 JIT 编译的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1503479/

相关文章:

java - Spring Boot 不替换 application.properties 文件中的环境变量

c - 理解汇编语言

assembly - 汇编语言中的数字地址

.net - 为什么不到处都有 JIT(Just In Time)编译器?

java - 无法在代码中向spark-cluster提交应用程序

java - Java哈希表中的哈希

java - 如果目标尚未启动,Java 中 Thread.join() 的行为是什么?

assembly - ARM反汇编一段被TBB搞糊涂了

java - JVM中包含哪些功能

java - 为什么 java.lang.Object.getClass() (和反射)比平时慢?