当前访客身份:游客 [ 登录  | 注册加入尚学堂]
启用新域名sxt.cn
新闻资讯

使用JITWatch监控JIT状态

helloworld 发表于 2年前  | 评论(0 )| 阅读次数(697 )|   0 人收藏此文章,   我要收藏
摘要 使用JITWatch监控JIT状态

性能是个很复杂的问题,尤其是当你意识到程序在编译阶段会经历多次重写的时候。首先,你的源码会被翻译成字节码,然后再被进一步编译成机器代码,有时候甚至是多次编译。

有时候你的程序运行得并不是很快。之后你就会抱怨你的平台或者工具,并且考虑用C或者什么奇怪的方式来重写系统中的关键部分。然而,在你开始这个黑暗过程之前,请先再看看:还有一些工具是能让你在享受着JVM便利的同时还把问题解决掉的。

如果充分发挥你对JVM内部以及JIT工作原理的知识,你可以优化你的程序让它执行得更快一些。但今天我们要讲的并不是这些优化本身。如果你对这些东西更感兴趣的话,可以看一个例子,”HikariCP是如何优化的“。我们今天要讲的是一个叫JITWatch的工具,你可以用它来查看JIT是如何去处理你的程序的。

JITWatch初瞥

JITWatch是Java Hotspot JIT编译器的一个日志分析工具。它会读入JIT的日志文件,然后将它的活动记录可视化。这个项目最初由Chris Newland发起,后面被捐赠给了Adopt OpenJDK这个项目。

如果你想知道JVM在运行时对你的代码做了什么或者需要调整JVM参数来优化虚拟机性能的时候,它可是个无价之宝。

除此之外,它还可以让你能同步地观察到程序的源码,字节码,以及机器代码,因此你不仅能更清楚应用的性能瓶颈,同时还能避免使用javap这样乱糟 糟的命令行工具。先进的工具让生活变得更轻松,在这篇文章里,我们将给一个示例项目进行JITWatch的配置,并观察它在启动期间到底发生了什么。

开始JITWatch之旅

首先我们得获取下它的可执行程序。幸运的是,正如每一个有自尊心的软件一样,JITWatch也能在Github上获取到,这样前期的编译可以省掉了,我们可以直接拷贝一个。

git clone git@github.com:AdoptOpenJDK/jitwatch.git cd jitwatch mvn clean install -DskipTests=true ./launchUI.sh # make sure that line-endings are correct :) 

完成之后,你会看到如下的漂亮的欢迎界面。

Java 工具及技术报告一文中所述,大多数人都是在进行WEB应用的开发,并且部署在Tomcat之上。 那看起来我们这个DEMO工程应该是一个WEB程序了。是的,你猜对了,它就是已使用多年的著名的Spring,我们将用它作为一个JRebel的 DEMO程序来运行。

这里是它的Github仓库地址,如果你希望拷贝一份修改一下的话。幸运的是,它是自我驱动的,因此我们什么都不用改就可以运行了。

mvn tomcat:run 

它会在petclinic的父目录执行,并完成所有的事情,创建一个Tomcat实例并将程序部署上去。这就是我们所想要的。

调整应用

为了能生成用来分析的hotspot.log文件,我们得给我们这个示例程序的进程增加几个JVM选项。

这是JITWatch的WIKI页面上推荐的选项:

-XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:+PrintAssembly 

把这些选项添加到Tomcat进程中最简单的方法就是直接增加到maven里面。执行一下 :

export "MAVEN_OPTS=$MAVEN_OPTS -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:+PrintAssembly" 

如果你的JDK警告说“PrintAssembly is disabled”,去下载一个hsdis就好了(

 现在开始分析吧,过一会儿JITWatch就会出结果了。
一些额外的特性

从JITWatch所提供的信息你能了解到什么?首先,会有一张编译的时间轴图。看到它我知道得等个一分钟左右才能编译完基本的类:注意,我们并没有给应用添加任何负载,因此我们定义的那些类还没有开始编译。

还有一个有用的东西就是最大字节码方法排行榜。方法越小,它就越有可能被JIT编译器内联。因此大的方法不只是降低了可读性,它还会带来性能的消耗。从这个视图可以看到哪些类或者方法是需要拆分的。 当然还有TriView,通过它你能看出机器目前究竟在执行什么东西。下面是TriView的一个示例,它显示的是一个BigInteger(String, int)的构造方法正在执行的过程,三个窗口还会同步高亮显示。

如果你感兴趣的方法还没有编译,JITWatch会提醒你,你可以给你的应用增加一些负载,或者调低一下JIT的阈值,这样编译器会认为这个方法执行的足够频繁,就会将它进行编译。
结束语:使用JITWatch来更好地查看应用的性能,负载以及执行速度

我们已经简单地了解了JVM的JIT是如何将字节码编译成机器代码的了,并创建了一个示例工程来进行实验。事实上,JITWatch就是一个非常简单直接的工具,你能够直观地了解到你的Java程序正在发生些什么。

如果你希望能更流畅地阅读JVM的字节码,我推荐你看一下我们的JRebel产品的老大写的这篇文章。

分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183