JIT的Profile神器JITWatch

简介

总是使用命令行工具在现代化社会好像已经跟不上节奏了,尤为是在作JIT分析时,使用LogCompilation输出的日志实在是太大了,让人望而生畏。有没有什么更加简便的方法来分析JIT日志呢?快来和小师妹一块儿来学习JITWatch吧。java

什么是JIT

小师妹,F师兄,JIT就是Just In Time compilers。能不能再总结一下JIT究竟是作什么的呢?git

固然没问题,JIT主要有两个做用,第一个做用你们应该已经知道了,就是在运行时将byte code编译成为机器码,提升程序的执行速度。程序员

第二个做用就是在运行时对代码进行优化,一样的也对性能进行提高。github

JIT中有两种编译器,C1表明的是Client Compiler,C2表明的是Server Compiler。spring

其中C1只是简单的编译,而C2在收集到更多信息以后,会进行更加深刻的编译和优化。编程

常见的优化手段有:Loop unrolling, Inlining, Dead Code Elimination,Escape analysis, Intrinsics, Branch prediction等。sass

JDK8中会默认启动分层编译。你也可使用-XX:+TieredCompilation来手动启动它。微信

更多精彩内容且看:jvm

JITWatch简介

小师妹:F师兄,上次你讲的LogCompilation和PrintCompilation输出结果仍是太复杂了,尤为是LogCompilation,输出的结果有十几M,分析起来好难。有没有更简单一点的办法,让个人工做效率加倍呢?spring-boot

这个必须有,有需求就有市场,有需求就有大神出场。今天给你介绍一个工具叫作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的博客

欢迎关注个人公众号:程序那些事,更多精彩等着您!

相关文章
相关标签/搜索