简介

老是使用命令行工具在现代化社会好像已经跟不上节奏了,尤其是在做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的博客

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

JIT的Profile神器JITWatch的更多相关文章

  1. jitwatch查看JIT后的汇编码

    1.下载Apache Maven 3.5.3 http://maven.apache.org/download.cgi apache-maven-3.5.3-bin.zip 解压为C:\maven3 ...

  2. 如何在windows平台下使用hsdis与jitwatch查看JIT后的汇编码

    1. 安装hsids 这一步比较麻烦,需要提前安装cygwin,以及下载openjdk的源码 具体步骤请参考下面的两篇文章 How to build hsdis-amd64.dll and hsdis ...

  3. 利用hsdis和JITWatch查看分析HotSpot JIT compiler生成的汇编代码

    http://blog.csdn.net/hengyunabc/article/details/26898657

  4. 【转】段错误调试神器 - Core Dump详解

    from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...

  5. .NET学习笔记 -- 那堆名词到底是啥(CLR、CLI、CTS、CLS、IL、JIT)

    什么是CLR? CLR,公共语言运行时(Common Language Runtime)是一个由多种语言使用的“运行时”.他的核心功能包括(内存管理.程序集加载.安全性.异常处理和线程同步),可以被面 ...

  6. JIT晚期(运行期)

    在部分的商用虚拟机(Sun HotSpot.IBM J9)中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为& ...

  7. 你的java 代码对JIT编译友好吗?

    JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中 ...

  8. JVM ,JIT ,GC RUNTIME 解析

    Java Class字节码知识点回顾 https://yq.aliyun.com/articles/2358?spm=5176.8067842.tagmain.105.fQdvH3 JVM Class ...

  9. 怎样让你的代码更好的被JVM JIT Inlining

    好书推荐:Effective Java中文版(第2版) JVM JIT编译器优化技术有近100中,其中最最重要的方式就是内联(inlining).方法内联可以省掉方法栈帧的创建,方法内联还使让JIT编 ...

随机推荐

  1. Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk

    输入输出样例 输入 #1 100 5 5 20 9 40 3 10 8 80 6 30 输出 #1 630 import java.util.Arrays; import java.util.Scan ...

  2. ClickHouse基本操作(一)

    常用SQL 创建表 1 2 3 4 5 6 7 CREATE TABLE b6logs( eventDate Date, impid UInt64, uid String, idfa String, ...

  3. 为.netcore助力--WebApiClient正式发布core版本

    1 前言 WebApiClient已成熟稳定,发布了WebApiClient.JIT和WebApiClient.AOT两个nuget包,累计近10w次下载.我对它的高可扩展性设计相当满意和自豪,但We ...

  4. Centos 文件系统基础命令

    目录 centos7的目录结构(linux所以的都文件,万物接文件) 1 pwd 显示当前所在的路径 2 cd 切换目录结构 3 mkdir创建目录信息 4 touch 创建文件(触摸) 5 ls 检 ...

  5. 小菜成长之路,警惕沦为 API 调用侠

    小菜(化名)在某互联网公司担任运维工程师,负责公司后台业务的运维保障工作.由于自己编程经验不多,平时有不少工作需要开发协助. 听说 Python 很火,能快速开发一些运维脚本,小菜也加入 Python ...

  6. 【PHP】如何将SESSION数据存放到Redis中

    在php中,SESSION的数据默认是存放到文件中,这样性能不仅不高,而且不利于扩展.在搭建集群后,默认存放到文件中就不适用了.所以,我们一般将SESSION自定义,让SESSION中的数据存放到 数 ...

  7. Ubuntu18.04 安装QQ、Tim、微信与win无差异

    一.安装deepin-wine环境: 桌面下打开终端,依次输入以下命令 git clone https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu.git ...

  8. (四)MySQL条件查询(通配符、模糊查询)、排序查询、分组查询(单行、分组函数)

    一.条件查询 1.含义:前面学的基础查询可以查询一个或多个字段,如果需要的数据仅仅是其中的某一行或多行就用到了条件查询. 2.语法:(序号表示语句执行顺序) SELECT 字段名 ③ FROM 表名 ...

  9. (二)MySQL8.0(ZIP)、SQLyog安装

    一.mysql8.0(ZIP)的安装 安装时看了很多的文章,开始选择的是客户端安装后一直安装失败,就选择了zip安装. 注意:该方法仅适用于8.0版本安装,其余版本未测试 1.下载zip压缩包(两个都 ...

  10. 恕我直言你可能真的不会java第2篇:Java Stream API?

    一.什么是Java Stream API? Java Stream函数式编程接口最初是在Java 8中引入的,并且与lambda一起成为Java开发的里程碑式的功能特性,它极大的方便了开放人员处理集合 ...