java如何在IDEA 中查看 Class文件的汇编
Posted 九师兄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何在IDEA 中查看 Class文件的汇编相关的知识,希望对你有一定的参考价值。
1.概述
转载:面经手册 · 第14篇《volatile 怎么实现的内存可见?没有 volatile 一定不可见吗?》
通过Class文件查看汇编,需要下载 hsdis-amd64.dll
文件,复制到 JAVA_HOME\\jre\\bin\\server
目录下。下载资源如下:
http://vorboss.dl.sourceforge.net/project/fcml/fcml-1.1.1/hsdis-1.1.1-win32-amd64.zip(opens new window)
http://vorboss.dl.sourceforge.net/project/fcml/fcml-1.1.1/hsdis-1.1.1-win32-i386.zip
另外是执行命令,包括:
基础指令:java -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
指定打印:-XX:CompileCommand=dontinline,类名.方法名
指定打印:-XX:CompileCommand=compileonly,类名.方法名
输出位置:> xxx
最终使用:java -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=dontinline,ApiTest.main -XX:CompileCommand=compileonly,ApiTest.mian
指令可以在IDEA中的 Terminal 里使用,也可以到 DOS黑窗口中使用
另外,为了更简单的使用,我们把指令可以配置到idea的 VM options 里,如下图:
配置完成后,不出意外的运行结果如下:
Loaded disassembler from C:\\Program Files\\Java\\jdk1.8.0_161\\jre\\bin\\server\\hsdis-amd64.dll
Decoding compiled method 0x0000000003744990:
Code:
Argument 0 is unknown.RIP: 0x3744ae0 Code size: 0x00000110
[Disassembling for mach='amd64']
[Entry Point]
[Constants]
# method 0x000000001c853d18 'getSnapshotTransformerList' '()[Lsun/instrument/TransformerManager$TransformerInfo;' in 'sun/instrument/TransformerManager'
# [sp+0x40] (sp of caller)
0x0000000003744ae0: mov r10d,dword ptr [rdx+8h]
0x0000000003744ae4: shl r10,3h
0x0000000003744ae8: cmp r10,rax
0x0000000003744aeb: jne 3685f60h ; runtime_call
0x0000000003744af1: nop word ptr [rax+rax+0h]
0x0000000003744afc: nop
[Verified Entry Point]
0x0000000003744b00: mov dword ptr [rsp+0ffffffffffffa000h],eax
0x0000000003744b07: push rbp
0x0000000003744b08: sub rsp,30h ;*aload_0
; - sun.instrument.TransformerManager::getSnapshotTransformerList@0 (line 166)
0x0000000003744b0c: mov eax,dword ptr [rdx+10h]
0x0000000003744b0f: shl rax,3h ;*getfield mTransformerList
; - sun.instrument.TransformerManager::getSnapshotTransformerList@1 (line 166)
0x0000000003744b13: add rsp,30h
...
以上是关于java如何在IDEA 中查看 Class文件的汇编的主要内容,如果未能解决你的问题,请参考以下文章
IDEA查看第三方jar包的源代码时出现Decompiled.class file, bytecode version:52.0 (Java 8)的解决方案