当应用程序性能下降时,大多数开发人员都会有理由感到恐慌。 一直以来,跟踪Java应用程序瓶颈的来源一直是一个主要的难题,这既是因为Java虚拟机具有黑匣子效应,又是因为传统上Java平台的分析工具不足。
但是,随着JConsole的引入,所有这些都改变了。 JConsole是一个内置的Java性能分析器,可从命令行和GUI Shell运行。 这并不完美,但是当尖头老板遇到性能问题时,这比第一道防线还足够,并且比向Papa Google咨询要好得多。
在本系列的5件事系列中,我将向您展示使用JConsole(或其外观复杂的表亲VisualVM)来监视Java应用程序性能并跟踪Java代码瓶颈的五种简单方法。
1. JDK附带了一个探查器
JConsole(或者对于较新的Java平台版本,为VisualVM)是内置的探查器,它与Java编译器一样容易启动。 在PATH
上具有JDK的命令提示符下,只需运行jconsole
。 在GUI Shell中,导航到JDK安装目录,打开bin文件夹,然后双击jconsole 。
弹出探查器工具时(取决于正在运行的Java版本和当前正在运行的其他Java程序的数量),它会显示一个对话框,询问要连接的进程的URL,或者列出许多不同的本地Java进程进行连接-有时包括JConsole进程本身。
使用JConsole
Java进程默认情况下设置为可分析。 在启动时,不必传递命令行参数-Dcom.sun.management.jmxremote
。 您只需要启动该应用程序,它将自动用于监视。 一旦JConsole选择了一个进程,您只需双击它即可开始分析。
探查器有其自己的开销,因此花一些时间弄清楚是什么是一个好主意。 发现JConsole开销的最简单方法是,首先自己运行一个应用程序,然后在探查器下运行它,然后测量差异。 (该应用程序不能太大或太小;我最喜欢的是JDK附带的SwingSet2演示应用程序。)因此,例如,我尝试使用-verbose:gc
运行SwingSet2以查看垃圾收集扫描,然后运行相同的应用程序,并将JConsole分析器连接到该应用程序。 连接JConsole时,发生了源源不断的GC扫描,而这在其他情况下是不会发生的。 那就是分析器的性能开销。
2.远程连接到进程
因为Web应用程序概要分析器假定要通过套接字进行连接以进行概要分析,所以您只需要进行一些配置即可设置JConsole(或任何基于JVMTI的概要分析器)来监视/概要分析远程运行的应用程序。
例如,如果Tomcat在名为“ webserver”的计算机上运行,并且该JVM启用了JMX并在端口9004上侦听,则从JConsole(或任何其他JMX客户端)连接到它将需要JMX URL为“ service:jmx:rmi” :/// jndi / rmi:// webserver:9004 / jmxrmi”。
本质上,对运行在远程数据中心中的应用程序服务器进行概要分析所需要的只是JMX URL。 (请参阅相关主题的更多信息远程监控和管理使用JMX和JConsole的。)
3.跟踪统计
JConsole具有许多可用于收集统计信息的选项卡,包括:
- 内存 :用于跟踪针对JVM的垃圾收集器中各种堆的活动。
- 线程 :用于检查目标JVM中的当前线程活动。
- 类 :用于查看VM的已加载总类数。
这些选项卡(以及相关的图形)全部由每个Java VM向JMX服务器注册的JMX对象提供,该JMX服务器是JVM内置的。 MBeans选项卡中列出了给定JVM中可用的Bean的完整列表,并带有一些元数据和有限的用户界面,用于查看该数据或执行那些操作。 (但是,注册通知超出了JConsole用户界面。)
使用统计
假设Tomcat进程不断死于OutOfMemoryError
。 如果您想了解发生了什么,请打开JConsole,单击“类”选项卡,然后随着时间的流逝对类计数保持懒惰的态度。 如果计数稳步上升,则可以假定应用服务器或您的代码在某处存在ClassLoader
泄漏,并且不久之后将耗尽PermGen
空间。 如果您需要进一步确认问题,请检查“内存”选项卡。
4.创建堆转储以进行脱机分析
在生产环境中,事情通常会快速移动,因此您可能没有足够的时间在应用程序探查器上花费时间。 相反,您可以为Java环境中的所有内容制作快照,并将其保存以供以后查看。 您可以在JConsole中执行此操作,在VisualVM中甚至可以做得更好。
首先导航到MBeans选项卡,在其中打开com.sun.management
节点,然后打开HotSpotDiagnostic
节点。 现在,选择“ Operations
,并注意显示在右侧窗格中的“ dumpHeap”按钮。 如果在第一个(“字符串”)输入框中传递dumpHeap一个要转储到的文件名,它将获取整个JVM堆的快照并将其转储到该文件。
以后,您可以使用各种不同的商业分析器来分析文件,或使用VisualVM来分析快照。 (请记住,VisualVM可作为独立下载提供。)
5. JConsole不是火箭科学
作为探查器实用程序,JConsole很不错,但是其他工具也更好。 一些探查器带有分析附件或光滑的用户界面,并且某些探查器默认情况下比JConsole跟踪更多的数据。
JConsole真正令人着迷的是,整个程序都是用“普通的Java”编写的,这意味着任何Java开发人员都可以编写类似的实用程序。 实际上,JDK甚至包含一个示例,该示例说明如何通过为其创建新插件来自定义JConsole(请参阅参考资料 )。 建立在NetBeans之上的VisualVM使插件概念进一步发展。
如果JConsole(或VisualVM或任何其他工具)不能完全满足您的要求,或者无法跟踪您要跟踪的内容,或者无法完全按照您希望的方式进行跟踪,那么您可以编写自己的代码。 而且,如果Java代码看起来过于繁琐,那么总可以使用Groovy或JRuby或其他十二种JVM语言中的任何一种来帮助您更快地完成它。
您真正需要的只是一个通过JMX连接的快捷命令行工具,您可以完全按照自己想要的方式跟踪感兴趣的数据。
结论
Java性能监控并没有以JConsole或VisualVM结尾-大多数开发人员都不知道JDK中隐藏了很多工具。 本系列的下一篇文章将深入研究一些实验性命令行工具,这些工具可以帮助您挖掘更多所需的性能数据。 因为这些工具通常专注于特定数据,所以它们比完整的探查器更小,更轻巧,因此不会产生相同的性能开销。
翻译自: https://www.ibm.com/developerworks/java/library/j-5things7/index.html