为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

森栏 2019-07-19 16:02:09

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

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



查看完整描述

3 回答

?
素胚勾勒不出你

一般用途

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

-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly

对特定方法进行筛选

还可以使用以下语法对特定方法进行筛选:

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

注:

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

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

如果你在运行Windows,本页有关于如何生成和安装的说明。hsdis-amd64.dllhsdis-i386.dll才能让它发挥作用。我们在下面复制并扩展该页*的内容,以供参考:


哪里可以获得预构建的二进制文件?

可以从fcml工程项目

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

这个版本的指南是在Windows8.1 64位上编写的,使用64位Cygwin并生产hsdis-amd64.dll

  1. 安装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. 下载最新的GNU binutils源代码包

    并将其内容解压缩到您的Cygwin主目录中。在撰写本报告时,最新的包裹是

    binutils-2.25.tar.bz2

    ..这将导致一个名为

    binutils-2.25

    (或任何最新版本)在您的Cygwin主目录中。
  4. 下载OpenJDK源代码

    转到JDK 8更新存储库

    ,选择与安装的JRE版本相对应的标记,然后单击bz 2。解压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 directory

    gcc: command not found

    ..编辑

    <Cygwin home directory>\hsdis\build\Linux-amd64\bfd\Makefile

    在文本编辑器(如写字板或记事本+)中更改

    SUBDIRS = doc po

    (第342行,如果使用binutils 2.25)到

    SUBDIRS = po

    ..重新运行前面的命令。

现在可以通过将dll复制到hsdis\build\Linux-amd64hsdis\build\Linux-i586去你的JREbin\serverbin\client目录。通过搜索,您可以在系统中找到所有这样的目录。java.dll.

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

*页面许可是CreativeCommons


查看完整回答
反对 回复 2019-07-19
?
慕莱坞森

您需要使用hsdis插件。PrintAssembly..一个方便的选择是基于FCML库的hsdis插件。

它可以为类UNIX系统编译,在Windows上可以使用FCML中可用的预构建库下载关于SourceForm的一节:

若要在Windows中安装:

  • 提取DLL(可在hsdis-1.1.2-win32-i386.zip和hsdis-1.1.2-win32-amd64.zip中找到)。
  • 将dll复制到存在的地方。

    java.dll

    (使用Windows搜索)。在我的系统里,我在两个地方找到了它:
    • C:\Program Files\Java\jre1.8.0_45\bin\server

    • C:\Program Files\Java\jdk1.8.0_45\jre\bin\server

要在Linux中安装:

  • 下载源代码,解压它
  • 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

  • 在我的系统中,jdk在

    /usr/lib/jvm/java-8-oracle

如何运行:

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

其他配置参数:

电码在记忆之前打印机器代码。
英特尔使用Intel语法。
毒气使用AT&T汇编程序语法(GNU汇编程序兼容)。
十二月打印IMM和位移量作为十进制值。
MPAD=XX指令的助记符部分的填充。
cpad=XX机器代码的填充。
赛格显示默认段寄存器。
在HEX文字的情况下显示前导零。

在Windows情况下,Intel语法是默认语法,而AT&T语法是GNU/Linux的默认语法。

有关详细信息,请参阅FCML图书馆参考手册


查看完整回答
反对 回复 2019-07-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信