JIT的Profile神器JITWatch
简介
老是使用命令行工具在现代化社会好像已经跟不上节奏了,尤其是在做JIT分析时,使用LogCompilation输出的日志实在是太大了,让人望而生畏。有没有什么更加简便的方法来分析JIT日志呢?快来和小师妹一起来学习JITWatch吧。
什么是JIT
小师妹,F师兄,JIT就是Just In Time compilers。能不能再总结一下JIT到底是做什么的呢?
当然没问题,JIT主要有两个作用,第一个作用大家应该已经知道了,就是在运行时将byte code编译成为机器码,提高程序的执行速度。
第二个作用就是在运行时对代码进行优化,同样的也对性能进行提升。
JIT中有两种编译器,C1代表的是Client Compiler,C2代表的是Server Compiler。
其中C1只是简单的编译,而C2在收集到更多信息之后,会进行更加深入的编译和优化。
常见的优化手段有:Loop unrolling, Inlining, Dead Code Elimination,Escape analysis, Intrinsics, Branch prediction等。
JDK8中会默认启动分层编译。你也可以使用-XX:+TieredCompilation来手动启动它。
JITWatch简介
小师妹:F师兄,上次你讲的LogCompilation和PrintCompilation输出结果还是太复杂了,尤其是LogCompilation,输出的结果有十几M,分析起来好难。有没有更简单一点的办法,让我的工作效率加倍呢?
这个必须有,有需求就有市场,有需求就有大神出场。今天给你介绍一个工具叫做JITWatch。
JITWatch是一个大神做的JIT日志的可视化分析工具。在使用它之前你可能觉得它有点强大,在使用后你就会觉得它真的是强大。
运行JITWatch
小师妹:F师兄,这么强大的工具,快快介绍我使用吧。
完全没有问题,不过JITWatch没有现成的打包好的可执行文件。没错,你需要到github上面下载源码。
下载完毕,可以执行:
mvn clean compile test exec:java
就可以开启JITWatch之旅了。
JITWatch详解
小师妹:F师兄,这么好用的工具为什么不打个包出来让大家直接用呢?还要下载源码这么麻烦。
其实吧,JITWatch为了大家方便使用,自带一个Sandbox功能,提供了一些可以直接在JITWatch中运行的代码,同时JITWatch可以实现源码的实时比对功能。所以需要大家下载源码。
闲话休提,我们开启JITWatch之旅吧。
入眼就是如此朴实无华的界面,让人感觉总有点...重剑无锋,大巧不工。高手做的UI就是这么的完美。
接下来我们需要运行一个程序,来实时感受一下JITWatch的魅力。
看到左边最上角的sandbox了吗?点开它可以看到下面的sandbox页面:
这一个页面会选择一个sadbox中的例子展示给你,大家注意下面的输出框的说明,它会显示你的Disassembler是否可用。如果想要安装disassembler,请参照我之前的文章。
如果你对这个例子不满意,或者你想使用自己的代码,那也完全没有问题。点击config。
这里你可以配置源代码的路径,可以选择VM的语言,还有各种VM的选项,下面的选项相信我在之前的文章中都已经介绍过了吧。
如果还有不懂的小伙伴,微信我,私聊我,1对1现场教学。
万事俱备,只欠东风,开始吧,我可是要成为Java王的男人!
然后我们就进入了TirView界面,这里我们可看到主界面分成了三部分,源代码,ByteCode和Assembly。
小师妹:真是热泪盈眶啊,终于不需要自己去添加那些XX参数了。面向界面编程,真好。
上面还有几个按钮,这里简单介绍一下他们的功能,具体的界面这里就不截图了,因为实在是太多了....
Chain会展示调用链。
Journal就是之前使用LogCompilation产生的xml日志。
LNT,全称是line number table。---目前我还不知道这个是做什么用的,有知道的朋友,请给我留言。
然后就是Inlined into功能了,这个功能要详细讲一下,因为会影响到程序的执行效率。
还记得之前举的inline的例子吗?
int a = 1; int b = 2; int result = add(a, b); ... public int add(int x, int y) { return x + y; } int result = a + b; //内联替换
上面的add方法可以简单的被替换成为内联表达式。
JITWatch可以显示方法是否被inlined,并且显示出inlined的原因。
点击BCI可以显示关联的inlined的代码。大家自行体会。
现在再让我们回到可爱又有风格的主页面:
左边是源代码,包含了JDK自己的代码,如果你想详细的分析JDK自己代码的优化,那么这是一个非常好的工具。
右边显示的是被JIT编译的类和方法,并且展示了编译级别和编译的时间。
右上角又有一排按钮,Config是用来配置运行的代码。
TimeLine是以图形的形式展示JIT编译的时间轴。
Histo是直方图展示的一些编译信息。
TopList里面是编译中产生的一些对象的或者数据的排序。
Cache是free code cache空间。
NMethod是native方法。
Threads是JIT编译的线程。
TriView就是我们最开始展示的面板。
最后我们重点讲一下Suggestion:
Suggestion是对代码的一些优化建议。
从上图我们可以看到在调用String的hashMap方法时候无法inlined,因为被调用的方法太大了,超出了最大inlining size。
总结
所以,我们通过JITWatch可以学到什么呢?最最重要的是我们可以通过JITWatch来分析JIT的运行原理和本质。然后inlined的方法不要太大了,否则影响执行效率。
本文作者:flydean程序那些事
本文链接:http://www.flydean.com/jvm-jit-jitwatch/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
大多数公司仍然饱受SOC人员短缺的痛苦
根据 Exabeam 的调查,绝大多数人觉得 SOC 的威胁检测能力很可靠,但组织并没有因为此而变得更安全。技术上向 SOAR 发展,而人员短缺的情况也要得到重视。 Exabeam 在 2020 年发布的 SOC 调查报告中发现,82% 的 SOC 人员对检测威胁的能力充满信心,但只有 22% 的人统计过平均检测时间(MTTD)。 这种毫无理由的自信让 39% 的公司仍然陷在缺少 SOC 人员的泥潭中,并且一直在寻找合格的人才来弥补缺口。 调查在美国、英国、加拿大、德国和澳大利亚展开,共计 295 个调查对象。此外,还针对分析人员和 SOC 管理层如何看待安全运营、人员招聘、人员配置、人员培训和资金花费等方面的内容展开了调查。 “从 2018 年到 2019 年,DWELL 时间(攻击发生到发现攻击的时间间隔)实际上是正在增加的,但这份调查报告中发现大家对网络威胁检测能力的信任是令人惊讶的”,Exabeam 首席安全策略官Steve Moore如是说。 这种不平衡可能是由于 SOC 管理层和一线分析人员对组织面临的最常见威胁没有达成共识。SOC 管理层人为网络钓鱼和供应链漏洞是问题的核...
- 下一篇
物联网开发服务开发虚拟设备需要几步?
云栖号快速入门:【点击查看更多云产品快速入门】不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 物联网平台设备的正常开发流程是:设备端开发完成,设备上报数据,云端接收数据,云端开始开发工作。该开发流程战线较长,耗时较久。而虚拟设备可以快速模拟真实设备产生业务数据,是最快体验IoT Studio开发能力的途径。本案例根据开发虚拟设备的数据,完成应用的开发调试。 操作步骤 1.在物联网平台控制台左侧导航栏,单击IoT Studio > 项目管理。2.在普通项目列表中,找到目标项目,单击项目名称。您也单击全局资源项目,进入该项目详情页面。3.在项目页面,单击左侧导航栏的设备。4.在设备列表上方,选择产品温度检测器。5.找到新增的温度检测器设备,单击设备右侧操作栏的查看。6.在设备详情页选择在线调试 > 调试虚拟设备 > 启动虚拟设备 > 属性上报。7.使用虚拟设备上报模拟属性值到云端。本示例中使用random()函数生成随机值来模拟设备属性值,以连续推送策略上报到云端。 执行结果 在设定的时间推送数据后,可在页面右侧实时日志下查看操作日志。数...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Hadoop3单机部署,实现最简伪集群
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境