资料 2:查看 Java 代码对应的汇编代码

内容来自王争 Java 编程之美

Java 编译的过程会将代码先编译成字节码,然后再编译成机器码,中间并不会涉及汇编代码
查看 Java 代码对应的汇编代码,是件挺麻烦的事情,需要使用额外的反汇编工具 hsdis,将机器码再反汇编为汇编代码

hsdis 安装的过程如下所示

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u

cd jdk8u/hotspot/src/share/tools/hsdis/

wget http://ftp.heanet.ie/mirrors/ftp.gnu.org/gnu/binutils/binutils-2.30.tar.gz

tar -xzf binutils-2.30.tar.gz

make BINUTILS=binutils-2.30 ARCH=amd64

# java 8
sudo cp build/macosx-amd64/hsdis-amd64.dylib 
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk
/Contents/Home/jre/lib/server/

# java 9 onwards
sudo cp build/macosx-amd64/hsdis-amd64.dylib 
/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home/lib/server/

安装完成之后,我们在使用以下命令来输出汇编代码

Java -XX:+PrintAssembly -Xcomp 
-XX:CompileCommand=compileonly,Hello.test com.wz.Hello

-Xcomp 让虚拟机以编译模式执行代码
-XX:CompileCommand=compileonly,Hello.test 只编译 test()
-XX:+PrintAssembly 输出反汇编内容

为了方便查看 Java 代码与汇编代码的对应关系,我们可以进一步安装 JITWatch 软件,如下所示

1.下载源码:
git clone https://github.com/AdoptOpenJDK/jitwatch.git

2.编译
cd jitwatch
mvn clean compile test exec:java

3.启动(仍在 jitwatch 目录下)
sh launchUI.sh
posted @ 2023-05-11 19:29  lidongdongdong~  阅读(122)  评论(0编辑  收藏  举报