JITWatch
TIPS
[重要程度]:了解即可
JITWatch使用较为复杂,需对编译原理、汇编、机器码有所了解才能玩得比较好。而这些内容,限于本套课程篇幅,无法展开。
因此,同学们如果一时间掌握不了,也无需担心。本文主要还是为了给大家构建相对完整的工具链知识体系(毕竟JITWatch是在其领域中非常典型的工具)。实际项目中这个领域的调优做得还是比较少的,可以先留个印象,以后汇编、机器码、编译源码等知识积累足够了自然就会比较轻松了。
JITWatch是JIT编译器的日志分析器与可视化工具。可用来检查内联决策、热点方法、字节码以及汇编的各种细节。它经常和HSDIS配合使用。
- GitHub:https://github.com/AdoptOpenJDK/jitwatch
Wiki:https://github.com/AdoptOpenJDK/jitwatch/wiki/Troubleshooting
安装HSDIS
TIPS
即使不安装HSDIS,也不会影响JITWatch的运行,但是不安装HSDIS的话,就无法用JITWatch查看汇编相关内容了
HSDIS是一个HotSpot虚拟机即时编译代码的反汇编插件,它包含在HotSpot虚拟机的源码当中,在OpenJDK的网站也可以找到单独的源码下载,但并没有提供编译后的程序。
不同操作系统安装方式略有不同,但是总的步骤是一样的:准备好HSDIS文件(从源码编译HSDIS,或下载已编译好的HSDIS文件)
将HSDIS文件放置到JDK中指定的目录(详见HSDIS存放目录)
从源码编译
TIPS
这里只讨论了JDK 8和JDK 11。事实上,从JDK 9+开始,安装方式和JDK 11一致。
HSDIS源码地址:JDK 11:https://hg.openjdk.java.net/jdk/jdk/archive/jdk-11+7.tar.bz2/src/utils/hsdis
- JDK 8:https://hg.openjdk.java.net/jdk/jdk/archive/jdk8-b116.tar.bz2/hotspot/src/share/tools/hsdis
安装说明
- JDK 11:https://github.com/openjdk/jdk/tree/jdk-11+7/src/utils/hsdis
- JDK 8:https://github.com/openjdk/jdk/tree/jdk8-b116/hotspot/src/share/tools/hsdis
HSDIS存放目录
- JDK 11:$JAVA_HOME/lib/server/
- JDK 8:存放到 $JAVA_HOME/jre/lib/server/
也可参考:《 各系统下安装HSDIS 》中的说明编译,里面有各种操作系统如何编译的说明。
下载已编译完成的HSDIS文件
TIPS
不同操作系统、不同JDK版本下的HSDIS文件不能通用,因此,务必搜索和你操作系统、JDK版本都一致的HSDIS文件!!!
- 可在CSDN上搜索各版本的HSDIS文件,不过笔者没有亲测
- 在 GitHub 上有Windows环境下的编译说明,并提供了hsdis的编译后文件
- 适用于macOS JDK 11下的HSDIS文件:
链接:https://pan.baidu.com/s/1HXjzNDpzin6fXGrZPyQeWQ 密码:aon2
# 详见tools/hsdis目录
macOS JDK 11下编辑-源码安装HSDIS全过程
```shell
下载并解压hsdis wget https://hg.openjdk.java.net/jdk/jdk/archive/jdk-11+7.tar.bz2/src/utils/hsdis
将目录切换到hsdis目录 cd src/utils/hsdis
在此目录中下载binutils,官方网站:http://sourceware.org/binutils/ wget http://ftp.heanet.ie/mirrors/ftp.gnu.org/gnu/binutils/binutils-2.28.tar.gz
解压binutils tar -xzf binutils-2.28.tar.gz
编译HSDIS make BINUTILS=binutils-2.28 ARCH=amd64
将hsdis-amd64.dylib拷贝到$JAVA_HOME/lib/server下 sudo cp build/macosx-amd64/hsdis-amd64.dylib $JAVA_HOME/lib/server/
<a name="WaiSI"></a>
## 启动应用
```shell
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp -XX:+LogCompilation -XX:LogFile=/Users/itmuch.com/logfile.log -XX:+TraceClassLoading -jar xxx.jar
其中:
- UnlockDiagnosticVMOptions:开启诊断信息
- PrintAssembly:输出反汇编内容
- Xcomp:以编译模式启动,这样,无执行足够次数来预热即可触发即时编译
- LogCompilation:打印编译相关信息
- LogFile:指定日志文件
- TraceClassLoading:是否跟踪类的加载
执行完后,将会生成一个 /Users/itmuch.com/logfile.log 文件。里面包括了各种类编辑以及汇编信息
使用JITWatch可视化阅读日志
1. 下载JITWatch源码,并切换到JITWatch的源码根目录(如果不会用Git,也可点击https://github.com/AdoptOpenJDK/jitwatch/archive/master.zip下载源码)
git clone https://github.com/AdoptOpenJDK/jitwatch.git
cd jitwatch
2. 启动JITWatch
mvn clean compile exec:java
3. 点击Open Log,并选择上面的日志文件
4. 点击Config,并配置源码目录及JDK src
5. 点击Start
即可可视化地分析了。