准备工作

工具下载:

我们需要自行下载jdk源码,并编译hotspot/src/shared/tools/hsdis,生成hsdis-amd64.dylib(OSX平台)

操作步骤

步骤如下

  • 下载OpenJdk源码,这里我下载的是OpenJdk8
  • 下载binutils-2.28.tar.gz,地址:https://ftp.gnu.org/gnu/binutils/ 这里选这个版本是因为我这里的jdk源码版本有个bug,在binutils-2.29+版本无法编译成功
  • 下载完成之后,进入源代码路径hotspot/src/shared/tools/hsdis
  • 复制刚刚下好的binutils-2.28.tar.gz到当前目录,解压tar -zxf binutils-2.28.tar.gz
  • 执行编译命令make BINUTILS=binutils-2.28 ARCH=amd64,如果是其他平台,可以自行查找编译命令
  • 编译完成后执行sudo cp build/macosx-amd64/hsdis-amd64.dylib /Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/jre/lib/server将编译出来的文件复制到$JAVA_HOME/jre/lib/server目录
  • 然后在执行java文件的时候添加上启动参数
    • -Xcomp
    • -XX:+UnlockDiagnosticVMOptions
    • -XX:+PrintAssembly
  • 也可以指定只查看某个方法的汇编代码,通过添加参数如
    • -XX:CompileCommand=compileonly,*Singleton.getInstance
  • 指定反汇编某个类-XX:CompileOnly=com/xx/concurrency/DoubleCheckSingleton
  • Oracle - Java启动参数

操作结果

image.png

参考资料