Java 如何在JVM中查看JIT编译的代码?
有什么方法可以在JVM中查看JIT生成的本机代码吗?如果您在windows机器上运行WinDbg,我相信WinDbg会很有帮助。 我刚用完一罐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
- 然后我附加到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
- 然后我们可以查找方法地址:
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
注:
- 您可能需要根据操作系统等将第二个参数放在引号内
- 如果方法内联,您可能会错过一些优化
hsdis-amd64.dll
和hsdis-i386.dll
的说明,这些说明是使其正常工作所必需的。我们复制以下内容并扩展该页*的内容以供参考:
从何处获取预构建的二进制文件 您可以从该项目下载预构建的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
C:\Cygwin\home\\
或C:\cygwin64\home\\\
)binutils-2.25.tar.bz2
。这将在Cygwin主目录中产生一个名为binutils-2.25
(或任何最新版本)的目录src\share\tools
中)解压缩到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
。重新运行上一个命令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