环境
1.机器型号:MacBook Pro (Retina, 15-inch, Mid 2015)
2.CPU型号:2.5 GHz Intel Core i7
3.操作系统:macOS 10.12.5 (16F73)
4.内核版本:Darwin 16.6.0
5.JDK版本:java version "1.8.0_101"(重要,jdk版本不同hsdis库可能要重新编译)
相关源码
1.jdk8地址:http://hg.openjdk.java.net/jdk8/jdk8
2.JITWatch源码:https://github.com/AdoptOpenJDK/jitwatch
预备知识
1.hsdis:查看JIT编译汇编代码,目录位置:jdk8/hotspot/src/share/tools/hsdis
2.JVM相关参数:
-server 表示jvm以C2编译器编译
-Xcomp 以编译模式运行,默认为mix
-XX:+TraceClassLoading 打印类加载日志
-XX:+PrintAssembly 打印汇编代码,需要hsdis支持
-XX:LogFile=path/jit.log 将jvm输出日志输入到jit.log中
3.JITWatch 开源分析jvm汇编命令工具
安装
一、hsdis编译安装
1.cd hotspot/src/share/tools/hsdis #jdk8源码中
2.下载binutils源码:(编译hsdis需要,jdk8需要2.26版本/jdk7则为2.24版本)
wget http://ftp.heanet.ie/mirrors/gnu/binutils/binutils-2.26.tar.gz
tar -xvf ./binutils-2.26.tar.gz
3.此步骤操作均在hsdis目录下:
export CPP=/usr/bin/cpp #这里需要先设置环境变量CPP,否则make时会报错
make BINUTILS=binutils-2.26 ARCH=amd64 #编译hsdis
mac下可能会有一下报错:
fatal error: sys/types.h: No such file or directory
解决:
xcode-select --install #按弹出框提示安装,注意,这里需要先安装xcode
安装完成后再次执行make BINUTILS=binutils-2.26 ARCH=amd64
4.hsdis编译完成:
对应lib目录为./build/macosx-amd64/hsdis-amd64.dylib
设置环境变量:
sudo vi /etc/profile
LD_LIBRARY_PATH="/Volumes/home/Users/preideas/work/jit"
5.检验hsdis库是否生效:
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version > 1.txt
说明:
这里因为以上命令输出过多,所以重定向至1.txt
若看到以下输出,则说明hsdis安装成功:
二、JITWatch安装:
1.下载源码:
git clone https://github.com/AdoptOpenJDK/jitwatch.git
2.编译:
cd jitwatch
ant clean compile test run #已安装maven环境的,也可以执行mvn clean compile test exec:java
3.启动:(仍在jitwatch目录下)
sh launchUI.sh
Eclipse参数配置
1.在要运行的java类上:右键-->run as -->run configurations-->Arguments,填入以下参数;
-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+LogCompilation -XX:+TraceClassLoading -XX:LogFile=/Volumes/home/Users/work/jit/jit.log
说明:
-XX:LogFile参数中path根据自己机器设置
JITWatch使用
1.将eclipse中生成的jit.log导入jitwatch,效果如下:
2.点击1图中TriView效果如下:
从上图可看出volatile关键,使用了cpu的lock指令
附录
1.mac已编译hsdis-amd64库(见附件)
2.mac已编译hsdis-i386库(见附件)