JITWatch查看字节码被JIT编译后的汇编代码

关注“Java艺术”一起来充电吧!

最近看书看到关于volitale关键字与jmm内存模型的介绍,这个知识点似乎看了好多次,背都能下来了。但理论性的东西真的很容易忘记,看不到摸不着。于是乎,我上网搜索看底层机器指令的实现,发现不少文章说可以看到java编译后的汇编代码,于是了解到jitwatch这个工具,从名字上也能看出jit编译器监视的意思。

JITWatch查看字节码被JIT编译后的汇编代码_第1张图片

我很感谢自己的好奇心,让我曾坚定的自学了一年的汇编语言。由于我是专科,学校并不开设汇编语言这门课,而我的第一门编程语言也是c,在学完c之后,不满足于对代码运行的原理,又自学了汇编。看过小甲鱼的汇编教学视频,第一本书是王爽的8086汇编,后面陆续看过386以及win32汇编。

由于有对汇编的一点认知,让我对java字节码产生了兴趣,所以去年学习jvm的时候,发现java字节码还挺容易的,后面因为兴趣,了解到asm这个工具包可以用于运行时编写或改写类的字节码,网上找不到什么文档,就硬着头皮去看api文档,用Google翻译来着。试错n次之后终于会用asm了。好像我github上还有两个小框架是用asm写字节码实现的,最近写的一个是实现异步方法,也写过基于字节码实现的动态代理、调用链监控。

但由于能力有限,都只是学了些皮毛。我想这点皮毛也能让我理解更多一些知识点。扯得有点多,今天是想跟大家分享如何查看java经过jit编译后生成的汇编代码。

Java文件编译后生成class文件,包含字节码,字节码由jvm解释执行,为了提高程序的运行效率,java提供了jit编译器,编译热代码。如果一段代码经常被调用,会被jit编译为机器码,后续调用不再解释执行。所以要查看汇编代码必须要让这段代码被多次调用。

1

使用HSDIS查看汇编代码

HSDISHotSpot disassembler的缩写,要使用HSDIS需要下载hsdis-amd64.dylib

JITWatch查看字节码被JIT编译后的汇编代码_第2张图片

适用于mac系统hsdis-amd64.dylib下载链接:

https://github.com/evolvedmicrobe/benchmarks/blob/master/hsdis-amd64.dylib?spm=a2c4e.10696291.0.0.13ce19a46a5XRa&file=hsdis-amd64.dylib

将其放到$JAVA_HOME/jre/lib/目录下

JITWatch查看字节码被JIT编译后的汇编代码_第3张图片

可通过命令行使用javac命令编译运行java文件,在命令行执行java -XX:+PrintAssembly -XX:+UnlockDiagnosticVMOptions xxx >> assembly_code.txt就能得到大量汇编代码。也可以在idea中通过配置VM参数使用,如下图。

debug后会在idea的控制台输出汇编代码

JITWatch查看字节码被JIT编译后的汇编代码_第4张图片

但是这种方式并不友好,会将java包下的代码也输出,很难找到某个类的某个方法的汇编代码,如果只是一个简单的java类还好。


2

使用VisualVM的插件

这种方法我没有试过,不过确实有这么个插件SAPlugin

JITWatch查看字节码被JIT编译后的汇编代码_第5张图片

3

使用JITWatch

jitwatch是一个开源项目,有详细的使用文档。需要下载代码自己编译。提前条件都是需要hsdis-amd64.dylib的支持。

下载链接:

https://github.com/AdoptOpenJDK/jitwatch/releases

不要下载master分支下的代码,下载releases版本的代码。直接下载master分支下的代码会出现编译问题,所以我选择下载releases版本。编译运行可看wiki我习惯使用gradlegradle使用gradlew clean build run编译运行。

JITWatch查看字节码被JIT编译后的汇编代码_第6张图片

  • 第一步:打开一个代码文件,JITWatch支持kotlinJavaScala等运行在JVM上的语言

  • 第二步:配置sandbox,见下图

  • 第三步:选择源文件的语言类型

  • 第四步:点击Run使用javac命令编译运行,通过-cp指向sandbox中配置的目录为classpath,就是java代码源文件编译后class存放的路径。

JITWatch查看字节码被JIT编译后的汇编代码_第7张图片

  • 配置编译后class文件存放的路径,也是运行时用户类路径classpath

  • 配置VM参数,打印汇编代码

JITWatch查看字节码被JIT编译后的汇编代码_第8张图片

图中的红框就是显示源代码与字节码与汇编代码的映射,可以通过方向键的上下键移动红框。除代码映射之外,还可以选择查看某个方法。此外,还可以返回主窗口,查看哪些类被JIT编译了,以及可以选择一个感兴趣的类打开TriView查看汇编代码。

JITWatch查看字节码被JIT编译后的汇编代码_第9张图片

往期原创精选

java手写字节码必须要了解的知识点,关于方法表和栈桢的理解

根据java字节码逆推出java代码

java的class文件结构解读

公众号:Java艺术

扫码关注最新动态

你可能感兴趣的:(JITWatch查看字节码被JIT编译后的汇编代码)