首页 > 代码库 > 聊聊JVM(十)Mac下hsdis和jitwatch下载和使用

聊聊JVM(十)Mac下hsdis和jitwatch下载和使用

网上已经有了详细的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的利器,下载下来用一用吧



聊聊JVM(十)Mac下hsdis和jitwatch下载和使用