a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 145|回复: 1

[基础知识] Java性能监控应对编程困难

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
很多开发者觉得自己懂Java编程,事实是大多数开发人员都只领会到了Java平台的皮毛,所学也只够应付工作。作者将深度挖掘Java平台的核心功能,揭示一些鲜为人知的事实,帮助您解决最棘手的编程困难。# _9 R3 y1 ^! D
   
- w7 B* J2 A7 R7 h8 y$ |- r    当应用程序性能受到损害时,大多数开发人员都惊慌失措,这在情理之中。跟踪Java应用程序瓶颈来源一直以来都是很麻烦的,因为Java虚拟机有黑盒效应,而且Java平台分析工具一贯就有缺陷。9 ^& t( `  u: J4 w* _. |! ]
    & v' m3 [( ^3 v+ A+ i/ Z
    然而,随着Java5中JConsole的引入,一切都发生了改变。JConsole是一个内置Java性能分析器,可以从命令行或在GUIshell中运行。它不是完美的,但是当尖头老板来问你关于性能的问题时,用它来应对还是绰绰有余的--这比查询PapaGoogle要好得多。! e1 S7 \4 B( i! @/ Y
   
$ P% x9 T+ B' Y; a+ E    我们将向您展示5个方法,使您可以轻松地使用JConsole(或者,它更高端的"近亲"VisualVM)来监控Java应用程序性能和跟踪Java中的代码。- h- M: g' A; I2 k0 ~
    ; Q3 k/ j* Z9 l9 l
    1.JDK附带分析器
% |% p# d$ m  K' v! p% s5 L0 }      `: W$ Z! l* n7 m
    许多开发人员没有意识到从Java 5开始JDK中包含了一个分析器。JConsole(或者Java平台最新版本,VisualVM)是一个内置分析器,它同Java编译器一样容易启动。如果是从命令行启动,使JDK在PATH上,运行jconsole即可。如果从GUIshell启动,找到JDK安装路径,打开bin文件夹,双击jconsole.
% v3 Y) r# ^9 @7 |+ Z* F% `    7 Y% q8 z7 G4 ]: T
    当分析工具弹出时(取决于正在运行的Java版本以及正在运行的Java程序数量),可能会出现一个对话框,要求输入一个进程的URL来连接,也可能列出许多不同的本地Java进程(有时包含JConsole进程本身)来连接。$ G' @1 ?  M( T" l3 X9 x0 \! L5 w
   
7 X; r+ ^; ]/ J$ v7 ]6 y- A    使用JConsole进行工作: I, |) C( i$ {, B- T0 O& @
    1 @/ R/ V* ]" O% E$ X; J8 b
    在Java 5中,Java进程并不是被设置为默认分析的,而是通过一个命令行参数--Dcom.sun.management.jmxremote--在启动时告诉Java 5 VM打开连接,以便分析器可以找到它们;当进程被JConsole捡起时,您只能双击它开始分析。4 B( x* v6 l1 |1 u8 D- b2 Q
   
# o5 c* u% n6 N3 |; y& i" t    分析器有自己的开销,因此最好的办法就是花点时间来弄清是什么开销。发现JConsole开销最简单的办法是,首先独自运行一个应用程序,然后在分析器下运行,并测量差异。(应用程序不能太大或者太小;我最喜欢使用JDK附带的SwingSet2样本。)因此,我使用-verbose:gc尝试运行SwingSet2来查看垃圾收集清理,然后运行同一个应用程序并将JConsole分析器连接到它。当JConsole连接好了之后,一个稳定的GC清理流出现,否则不会出现。这就是分析器的性能开销。
, |+ A  o' O' O( l- |- J   
( e+ ?" n$ T! ?8 b+ }    JConsole或VisualVM?www.Examw.com
2 ~( |$ R0 [' k0 F    % \0 N4 s6 R6 e! B
    JConsole从Java 5开始就随着Java平台版本一起发布,而VisualVM是在NetBeans基础上升级的一个分析器,在Java 6的更新版12中第一次发布。多数还没有更新到Java 6,因此这篇文章主要介绍JConsole.然而,多数技巧和这两个分析器都有关。
. ?! v4 u: i$ `   
  i/ X8 P2 K5 z6 L    2.远程连接进程! O. P. J0 \& Y* Z1 ~7 h
   
7 [, ~6 j$ q; u' Z    因为Web应用程序分析工具假设通过一个套接字进行连通性分析,您只需要进行少许配置来设置JConsole(或者是基于JVMTI的分析器,就这点而言),监控/分析远程运行的应用程序。
7 Z6 W' t) v& j' B3 A   
. R4 b9 c* O( T+ W    如果Tomcat运行在一个名为"webserve"的机器上,且JVM已经启动了JMX并监听端口9004,从JConsole(或者任何JMX客户端)连接它需要一个JMX URL"service:jmx:rmi:///jndi/rmi://webserver:9004/jmxrmi"." L( n2 @0 n, p: i
    2 U+ {  v$ o4 i- `3 a- a1 h+ `
    基本上,要分析一个运行在远程数据中心的应用程序服务器,您所需要的仅仅是一个JMX URL.
  m  S1 Q9 `( e$ U1 Q2 u- U   
7 A% h. k( X  L" I7 k/ F    3.跟踪统计8 C7 N/ M, Z# M* |& \  |
   
9 T# P; p" g% B' m2 f; `    JConsole有许多对收集统计数据有用的选项卡,包括:4 }; {* V$ s9 ?+ S5 [! V
   
. G0 A* A4 v: Z2 V    ◆Memory:在JVM垃圾收集器中针对各个堆跟踪活动。
! s* e2 l3 D5 k) b% j7 y   
& c+ ]2 N& g$ s# O9 N% m    ◆Threads:在目标JVM中检查当前线程活动。
, N& `+ }! l0 x% W4 |    3 f1 l' ], b- G, Z4 A
    ◆Classes:观察VM已加载类的总数。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

Java性能监控应对编程困难

这些选项卡(和相关的图表)都是由每个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中隐藏着一整套工具,只是大多数开发人员并不知道。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-5 20:24 , Processed in 0.180456 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表