windows下idea查看java编译后的汇编代码(hsdis+JITWatch)

第一步:下载hsdis

http://vorboss.dl.sourceforge.net/project/fcml/fcml-1.1.1/hsdis-1.1.1-win32-amd64.zip

http://vorboss.dl.sourceforge.net/project/fcml/fcml-1.1.1/hsdis-1.1.1-win32-i386.zip

 

第二步:将hsdis.dll存放到..\Java\jdk-11\bin\server目录下

第三步:打开IDEA,run>>Edit Configurations

第四步:在VM options里输入下面的指令

-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+PrintCompilation

第五步: 运行程序。下面只贴出了部分代码。

    164    1       4       java.lang.String::hashCode (55 bytes)
Loaded disassembler from C:\Program Files\Java\jdk1.8.0_171\jre\bin\server\hsdis-amd64.dll
Decoding compiled method 0x00000000038c07d0:
Code:
[Disassembling for mach='i386:x86-64']
[Entry Point]
[Constants]
  # {method} {0x000000001c5e4fc0} 'hashCode' '()I' in 'java/lang/String'
  #           [sp+0x30]  (sp of caller)
  0x00000000038c0900: mov    0x8(%rdx),%r10d
  0x00000000038c0904: shl    $0x3,%r10
  0x00000000038c0908: cmp    %r10,%rax
  0x00000000038c090b: jne    0x0000000003895f60  ;   {runtime_call}
  0x00000000038c0911: data16 xchg %ax,%ax
  0x00000000038c0914: nopl   0x0(%rax,%rax,1)
  0x00000000038c091c: data16 data16 xchg %ax,%ax
[Verified Entry Point]
  0x00000000038c0920: mov    %eax,-0x6000(%rsp)
  0x00000000038c0927: push   %rbp
  0x00000000038c0928: sub    $0x20,%rsp         ;*synchronization entry
                                                ; - java.lang.String::hashCode@-1 (line 1466)

  0x00000000038c092c: mov    %rdx,%rbx
  0x00000000038c092f: mov    0x10(%rdx),%eax    ;*getfield hash
                                                ; - java.lang.String::hashCode@1 (line 1466)

  0x00000000038c0932: test   %eax,%eax
  0x00000000038c0934: jne    0x00000000038c0a25  ;*ifne
                                                ; - java.lang.String::hashCode@6 (line 1467)

这样就能看到java文件编译后的汇编代码。


当然上面编译出来的代码想要用肉眼去看实在是太难难找到自己想要看的代码最后翻译成的汇编在哪里,实在是太多了。所以需要借助一些工具的帮助。这里推荐使用的是JITWatch这个工具。

首先需要从jithub上拉取项目的源代码并解压,然后在源代码所在的目录执行官方给的Maven,Gradel等不同环境下编译的指令。执行效果如下图:

整个编译过程很快,编译完成后会直接弹出UI界面。

点击sandbox进入沙箱环境。

1.点击open按钮选择你想要查看JIT编码后的java文件。

2.点击configure sandbox按钮进行设置。

3.在设置界面选定第一步java文件对应的class文件

4.设定虚拟机参数 -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly

5.点击Run按钮

进行完这些操作后就能看到JIT编译后的汇编代码了。

当然前提是代码不要太简单,不然执行之后看到的会是三个白面板没有任何内容。在这里我就踩了坑,一直找不到原因。

 

感谢阅读,希望对你有帮助。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值