使用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 [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”/>

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

[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],

你可能感兴趣的:(使用JITWatch监控JIT状态)