网上已经有了详细的hsdis和jitwatch的教材,比如这篇利用hsdis和JITWatch查看分析HotSpot JIT compiler生成的汇编代码
hsdis能够查看Java生成的汇编代码,具体的可以查看上面这篇文章。这里提供一下Mac下的hsdis-amd64.dylib和hsdis-amd64.so文件的下载地址http://pan.baidu.com/s/1i3HxFDF
免得还要重新去编译。前者是Mac 64位机器下的,后者是Linux 64位机器下的。
下载下来hsdis之后,最简单让java命令加载它的方法是把它放在一个目录下面,然后export一下这个目录就行,比如在.bashrc下面
export LD_LIBRARY_PATH=~/Documents/hsdis/
这样就可以使用hsdis来查看JIT生成的汇编代码了。可以用下面的命令来查看hsdis是否工作
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version
看到下面这个结果证明hsdis已经配置正确了
下面来试一下用hsdis来生成一个类的汇编码。
java -server指令指定了JIT使用C2编译器来优化,-Xcomp选项指定了JVM以编译模式运行,否则默认是Mix模式,只有热点代码才会被JIT编译优化。很多人说写的类没有被JIT编译,我的经验是这个类如果有main方法就会生成汇编码。-XX:+PrintAssembly 可以打印汇编码。执行下面命令可以让JIT编译并把结果生成到指定的log文件中
java -server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+PrintAssembly -XX:+LogCompilation
-XX:LogFile=jit.log test.TestMain
可以用jitwatch工具来查看刚生成的日志文件。 jitwatch可以从 http://pan.baidu.com/s/1i3HxFDF 下载。我放了一个jitwatch.sh在里面,下载下来之后改一下文件中的路径就可以直接运行了。
关于jitwatch的使用方法可以看这篇利用hsdis和JITWatch查看分析HotSpot JIT compiler生成的汇编代码
用jitwatch可以看到哪些方法被JIT编译了
在调用一个方法后,会设置OopMap状态,这是一个safepoint
在方法返回前,会插入safepoint polling page的代码 test %eax, 0xxxxxxx,以便让线程进入到这个safepoint的时候可以被阻塞
hsdis和jitwatch是学习JVM的利器,下载下来用一用吧