使用JITWatch监控JIT状态

[img]http://zeroturnaround.com/wp-content/uploads/2014/07/head-640x366.png[/img]

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

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

如果充分发挥你对JVM内部以及JIT工作原理的知识,你可以优化你的程序让它执行得更快一些。但今天我们要讲的并不是这些优化本身。如果你对这些东西更感兴趣的话,可以看一个例子,”[url=https://github.com/brettwooldridge/HikariCP/wiki/Down-the-Rabbit-Hole]HikariCP是如何优化的[/url]“。我们今天要讲的是一个叫[url=https://github.com/AdoptOpenJDK/jitwatch]JITWatch[/url]的工具,你可以用它来查看JIT是如何去处理你的程序的。

[b]JITWatch初瞥[/b]

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

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

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

[b]开始JITWatch之旅[/b]

首先我们得获取下它的可执行程序。幸运的是,正如每一个有自尊心的软件一样,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 :)



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

[img]http://zeroturnaround.com/wp-content/uploads/2014/07/welcomescreen-640x358.png”/>

很好,下面我们需要配置一下要研究的应用了。

[b]这是我们要进行实验的小白鼠[/b]

我们希望每篇博客都能有不止一个用途,因此很快我们就面临了这样的问题:

我们应该运行一个什么样的DEMO工程,这样它能代表大多数的Java开发的应用?

根据我们的[url=http://pages.zeroturnaround.com/Java-Tools-Technologies.html]Java工具及技术报告一文[/url]中所述,大多数人都是在进行WEB应用的开发,并且部署在Tomcat之上。 那看起来我们这个DEMO工程应该是一个WEB程序了。是的,你猜对了,它就是已使用多年的著名的Spring,我们将用它作为一个JRebel的DEMO程序来运行。

这里是它的[url=https://github.com/zeroturnaround/spring-petclinic]Github仓库地址[/url],如果你希望拷贝一份修改一下的话。幸运的是,它是自我驱动的,因此我们什么都不用改就可以运行了。




mvn tomcat:run



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


[b]调整应用[/b]


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


这是JITWatch的[url=https://github.com/AdoptOpenJDK/jitwatch/wiki]WIKI页面[/url]上推荐的选项:





[*]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就好了([url=http://dropzone.nfshost.com/hsdis.htm” target=“_blank”>WINDOWS[/url], <a href=]Linux[/url], <a href="http://www.nitschinger.at/Printing-JVM-generated-Assembler-on-Mac-OS-X” target=“_blank”>OSX[/url])。


[b]准备就绪,出发![/b]


只需一个mvn tomcat:run命令,我们就能看到一个hostpot_pid${pid}.log的文件,这里${pid}是JVM进程的ID,文件在petclinic工程的父目录中。


点击Config按钮将源码及类文件的路径关联起来,这样你的体验会更好一些。Add JDK src按钮会自动地将JDK源码的路径加上,因此你就点击一下就好了。


[img]http://zeroturnaround.com/wp-content/uploads/2014/07/config-640x416.png[/img]


现在开始分析吧,过一会儿JITWatch就会出结果了。


[b]一些额外的特性[/b]


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


[img]http://zeroturnaround.com/wp-content/uploads/2014/07/timeline-640x503.png[/img]

还有一个有用的东西就是最大字节码方法排行榜。方法越小,它就越有可能被JIT编译器内联。因此大的方法不只是降低了可读性,它还会带来性能的消耗。从这个视图可以看到哪些类或者方法是需要拆分的。

[img]http://zeroturnaround.com/wp-content/uploads/2014/07/largest-methods-640x208.png[/img]

当然还有TriView,通过它你能看出机器目前究竟在执行什么东西。下面是TriView的一个示例,它显示的是一个BigInteger(String, int)的构造方法正在执行的过程,三个窗口还会同步高亮显示。

[img]http://zeroturnaround.com/wp-content/uploads/2014/07/triview-marked-640x390.png[/img]

如果你感兴趣的方法还没有编译,JITWatch会提醒你,你可以给你的应用增加一些负载,或者调低一下JIT的阈值,这样编译器会认为这个方法执行的足够频繁,就会将它进行编译。

[b]结束语:使用JITWatch来更好地查看应用的性能,负载以及执行速度[/b]

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

如果你希望能更流畅地阅读JVM的字节码,我推荐你看一下我们的JRebel产品的老大写的[url=http://pages.zeroturnaround.com/RebelLabs-AllReportLanders_MasteringJavaBytecodeattheCoreoftheJVM.html]这篇文章[/url]。


原创文章转载请注明出处:[url=http://it.deepinmind.com/jvm/2014/07/18/why-it-rocks-to-finally-understand-java-jit-with-jitwatch.html]http://it.deepinmind.com[/url]

[url=http://zeroturnaround.com/rebellabs/why-it-rocks-to-finally-understand-java-jit-with-jitwatch/]英文原文链接[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值