Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JVM中查看JIT编译的代码?_Java_Assembly_Jvm_Jit - Fatal编程技术网

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

Java 如何在JVM中查看JIT编译的代码?,java,assembly,jvm,jit,Java,Assembly,Jvm,Jit,有什么方法可以在JVM中查看JIT生成的本机代码吗?如果您在windows机器上运行WinDbg,我相信WinDbg会很有帮助。 我刚用完一罐 然后我附加到java进程 通过Windbg 通过~命令检查线程;共有11个线程,0个线程是主工作线程 切换到0线程-~0s 通过kb查看未命名的调用堆栈,发现: 0008fba8 7c90e9c0 ntdll!KiFastSystemCallRet 0008fbac 7c8025cb ntdll!ZwWaitForSingleObject+0xc 00

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

如果您在windows机器上运行WinDbg,我相信WinDbg会很有帮助。 我刚用完一罐

  • 然后我附加到java进程 通过Windbg
  • 通过~命令检查线程;共有11个线程,0个线程是主工作线程
  • 切换到0线程-~0s
  • 通过kb查看未命名的调用堆栈,发现:

    0008fba8 7c90e9c0 ntdll!KiFastSystemCallRet
    0008fbac 7c8025cb ntdll!ZwWaitForSingleObject+0xc
    0008fc10 7c802532内核32!WaitForSingleObjectEx+0xa8
    0008fc24 00403a13内核32!WaitForSingleObject+0x12
    0008fc40 00402f68 java+0x3a13
    0008fee4 004087b8 java+0x2f68
    0008ffc0 7c816fd7 java+0x87b8

    0008FFF000000000内核32!BaseProcessStart+0x23

突出显示的行是在JVM上直接运行JIT ed代码

  • 然后我们可以查找方法地址:
    java+0x2f68是00402f68

  • 在WinDBG上:
    单击查看--> 反汇编。
    单击编辑-->转到 地址。
    00402f68在那里
    得到

    00402f68 55推式ebp
    00402f69 8bec mov ebp,esp
    00402f6b 81ec80020000子esp,280小时
    00402f71 53推动ebx
    00402f72 56推式esi
    00402f73 57推式电子数据交换
    等等


有关更多信息,请参阅如何使用process explorer和WinDbg从内存转储中追溯JIT ed代码。

假设您使用的是Sun Hotspot JVM(即Oracle提供的JVM),您可以添加该标志

-XX:+打印光电组件

当运行代码时。这将打印出JIT编译器生成的优化代码,并省略其余部分

如果要查看整个字节码,包括未优化的部分,请添加

-XX:CompileThreshold=#

当您运行代码时


您可以阅读有关此命令和JIT功能的更多信息。

查看机器代码和一些性能数据的另一种方法是使用AMD的CodeAnalyst或OProfile,它有一个Java插件,可以将执行Java代码可视化为机器代码。

对于HotSpot(was Sun)JVM,即使在产品模式下:

需要一些组件:它需要一个插件。

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

-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
根据特定方法进行筛选 还可以使用以下语法对特定方法进行筛选:

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

  • 您可能需要根据操作系统等将第二个参数放在引号内
  • 如果方法内联,您可能会错过一些优化
如何:在Windows上安装所需的库 如果您正在运行Windows,则提供了有关如何构建和安装
hsdis-amd64.dll
hsdis-i386.dll
的说明,这些说明是使其正常工作所必需的。我们复制以下内容并扩展该页*的内容以供参考:


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

您可以从该项目下载预构建的Windows二进制文件

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

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

  • 。在
    选择软件包
    屏幕上,添加以下软件包(通过展开
    开发
    类别,然后单击每个软件包名称旁边的
    跳过
    标签一次):

    • make
    • mingw64-x86\u 64-gcc-core
      (仅适用于
      hsdis-amd64.dll
    • mingw64-i686-gcc-core
      (仅适用于
      hsdis-i386.dll
    • diffutils
      (在
      Utils
      类别中)
  • 运行Cygwin终端。这可以使用安装程序创建的桌面或开始菜单图标完成,并将创建Cygwin主目录(
    C:\Cygwin\home\\
    C:\cygwin64\home\\\

  • 并将其内容解压缩到Cygwin主目录。在编写本文时,最新的包是
    binutils-2.25.tar.bz2
    。这将在Cygwin主目录中产生一个名为
    binutils-2.25
    (或任何最新版本)的目录
  • 下载OpenJDK源代码,方法是:选择与已安装JRE版本对应的标记,然后单击bz2。将hsdis目录(位于
    src\share\tools
    中)解压缩到Cygwin主目录
  • 在Cygwin终端中,输入
    cd~/hsdis
  • 要生成
    hsdis-amd64.dll
    ,请输入

    makeos=Linux-MINGW=x86_64-w64-mingw32'AR=$(MINGW)-AR'BINUTILS=~/BINUTILS-2.25

    要构建
    hsdis-i386.dll
    ,请输入

    makeos=Linux-MINGW=i686-w64-mingw32'AR=$(MINGW)-AR'BINUTILS=~/BINUTILS-2.25

    在这两种情况下,请用下载的binutils版本替换
    2.25
    OS=Linux
    是必需的,因为尽管Cygwin是一个类似Linux的环境,但hsdis makefile无法识别它本身

  • 生成将失败,消息为
    /chew:没有这样的文件或目录
    gcc:command未找到
    。在文本编辑器(如写字板或记事本+)中编辑
    \hsdis\build\Linux-amd64\bfd\Makefile
    ,将
    SUBDIRS=doc po
    (第342行,如果使用binutils 2.25)更改为
    SUBDIRS=po
    。重新运行上一个命令
  • 现在可以通过将DLL从
    hsdis\build\Linux-amd64
    hsdis\build\Linux-i586
    复制到JRE的
    bin\server
    bin\client
    目录来安装DLL。你可以找到所有的苏
    java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly 
    -XX:+LogCompilation -XX:PrintAssemblyOptions=intel,mpad=10,cpad=10,code 
    -jar fcml-test.jar