前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 JITWatch 查看 JVM 的 JIT 编译代码

使用 JITWatch 查看 JVM 的 JIT 编译代码

作者头像
用户1257393
发布2018-07-30 15:36:09
2.1K0
发布2018-07-30 15:36:09
举报
文章被收录于专栏:精讲JAVA

来源:刘正阳 , liuzhengyang.github.io/2017/07/27/jitwatch/

背景

我们知道Java代码通过编译器编译成字节码,一般是class文件,有JVM的各个类加载器加载后,根据JVM的启动配置可以进行解释执行和编译执行,编译执行是由JIT(Just In Time)Compiler将字节码编译成本地代码来提高执行速度,缺点是编译本身会消耗时间并且会占用堆外空间(codecache中), 但是一般Server应用内存足够且能够忍受启动时的略微缓慢。

查看Java源代码对应的bytecode可以通过javap来实现。

有时候我们想排查问题或者了解底层是如何实现的,就需要查看JIT编译后的汇编代码是什么样的,Hotspot提供了-XX:+PrintAssembly选项来输出编译后的汇编代码,缺点是输出日志量巨大,并且难以和代码中的对应起来。

JITWatch是一个查看JIT行为的可视化工具。

使用

安装和启动JitWatch

git clone https://github.com/AdoptOpenJDK/jitwatch cd jitwatch ./gradlew run

给JDK添加Hsdis

参考我的Github上的说明hsdis

https://github.com/liuzhengyang/hsdis

通过以下命令检测下是否安装成功

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -version

启动一个应用,并且配置输出日志

在应用中添加如下JVM参数

-XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:LogFile=/tmp/mylogfile.log -XX:+PrintAssembly -XX:+TraceClassLoading

然后在/tmp/mylogfile.log中就可以看到输出的日志了,在JITWatch界面中选择OpenLog选择日志,然后点击Open

然后选择想要查看的类和对应的方法,即可查看对应的源代码、ByteCode、JIT生成的AssemblyCode。

这里可以看到一个经常提到的volatile字段的实现,在MacOS x64的实现是在volatile write后添加一个lock指令作为StoreLoad屏障来保证可见性和防止重排序的。更多JMM的内容可以参考我的另一篇文章Java内存模型JMM浅析

https://liuzhengyang.github.io/2017/05/12/javamemorymodel/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精讲JAVA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档