使用JITWatch监控JIT状态

使用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 [email protected]: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”/>

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

这是我们要进行实验的小白鼠

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

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

根据我们的 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就好了([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])。


准备就绪,出发!


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


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


使用JITWatch监控JIT状态


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


一些额外的特性


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


使用JITWatch监控JIT状态

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

使用JITWatch监控JIT状态

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

使用JITWatch监控JIT状态

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

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

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

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





原创文章转载请注明出处: http://it.deepinmind.com

英文原文链接

你可能感兴趣的:(jvm,tomcat)