这些选项卡(和相关的图表)都是由每个Java 5及更高版本VM在JMX服务器上注册的JMX对象提供的,是内置到JVM的。一个给定JVM中可用bean的完整清单在MBeans选项卡上列出,包括一些元数据和一个有限的用户界面来查看数据或执行操作。(然而,注册通知是在JConsole用户界面之外。)$ T) U X. Z4 o/ W+ s
% z/ M: a" x [ Q- m1 W; t5 H: o( B
使用统计数据
2 {$ L2 m2 i) o% l/ O, L ) {* a x9 F3 u# f; i9 _% l/ L0 [
假设一个Tomcat进程死于OutOfMemoryError.如果您想要弄清楚发生了什么,打开JConsole,单击Classes选项卡,过一段时间查看一次类计数。如果数量稳定上升,您可以假设应用程序服务器或者您的代码某个地方有一个ClassLoader漏洞,不久之后将耗尽PermGen空间。如果需要更进一步的确认问题,请看Memory选项卡。
; F9 c& u3 `; D" y) {4 j & J/ g5 k, c$ J
不要成为典型# }& n/ X- P$ W. m2 B
" j1 g% \% j% A
发现应用程序代码中性能问题的常用响应多种多样,但也是可预测的。早期的Java编程人员对旧的IDE可能十分生气,并开始进行代码库中主要部分的代码复查,在源代码中寻找熟悉的"红色标志",像异步块、对象配额等等。随着编程经验的增加,开发人员可能会仔细研究JVM支持的-X标志,寻找优化垃圾收集器的方法。当然,对于新手,直接去Google查询,希望有其他人发现了JVM的神奇的"make it go fast"转换,避免重写代码。7 ~ F9 P; F7 D" j' H! n
9 y$ A- m1 j& M7 F9 n 从本质上来说,这些方法没什么错,但都是有风险的。对于一个性能问题最有效的响应就是使用一个分析器--现在它们内置在Java平台,我们确实没有理由不这样做!
: c2 U6 h- G" c0 d , ^/ {5 g" s( \4 n( l R
4.为离线分析创建一个堆转储
: Q8 r2 P1 V7 L. v" ~: t) N2 q
4 g& _# L9 i* p" Z; \ 生产环境中一切都在快速地进行着,您可能没有时间花费在您的应用程序分析器上,相反地,您可以为Java环境中的每个事件照一个快照保存下来过后再看。在JConsole中您也可以这样做,在VisualVM中甚至会做得更好。
% H# E4 N7 r* H& } - ^9 v& q+ T$ {3 p
先找到MBeans选项卡,在其中打开com.sun.management节点,接着是HotSpotDiagnostic节点。现在,选择Operations,注意右边面板中的"dumpHeap"按钮。如果您在第一个("字符串")输入框中向dumpHeap传递一个文件名来转储,它将为整个JVM堆照一个快照,并将其转储到那个文件。
' G, \; ?- y4 ]( l" ` & P0 m0 g- K. ~3 h7 ]
稍后,您可以使用各种不同的商业分析器来分析文件,或者使用VisualVM分析快照。(记住,VisualVM是在Java 6中可用的,且是单独下载的。)
' p, w. E: G' _5 a . K+ u1 Z% ?+ K; C% l3 U7 f
5.JConsole并不是高深莫测的2 ]6 X E; z/ f) U- U9 h/ }
2 ?& z9 E h0 W( m% c 作为一个分析器实用工具,JConsole是极好的,但是还有更好的工具。一些分析插件附带分析器或者灵巧的用户界面,默认情况下比JConsole跟踪更多的数据。
, @" ^1 }; C0 b o( O
' u6 ^, t7 n5 L( _ JConsole真正吸引人的是整个程序是用"普通旧式Java"编写的,这意味着任何Java开发人员都可以编写这样一个实用工具。事实上,JDK其中甚至包括如何通过创建一个插件来定制JConsole的示例。建立在NetBeans顶部的VisualVM进一步延伸了插件概念。2 ?2 p8 I) S( F3 p# k
; P. B' ~8 D4 Y. I5 j% _1 r, V1 m 如果JConsole(或者VisualVM,或者其他任何工具)不符合您的需求,或者不能跟踪您想要跟踪的,或者不能按照您的方式跟踪,您可以编写属于自己的工具。如果您觉得Java代码很麻烦,Groovy或JRuby或很多其他JVM语言都可以帮助您更快完成。) n5 k! H* s. d) V( o
4 r/ w* M/ n J2 M+ J
您真正需要的是一个快速而粗糙(quick-and-dirty)的由JVM连接的命令行工具,可以以您想要的方式确切地跟踪您感兴趣的数据。3 |: u% V, c6 y9 F# B, B% X
7 K9 G7 k# d; |' m6 y
结束语
1 m$ p1 R$ z; k0 ]/ ]5 l3 W
" W" l, `0 v* D- r# d" p Java性能监控不止于JConsole或VisualVM--在JDK中隐藏着一整套工具,只是大多数开发人员并不知道。 |