《Java Performance》笔记3——Java应用性能分析工具

1.Java应用性能分析的方法分析和内存分析:

方法分析:能够提供java应用程序中方法执行时间的信息,既包括java方法也包括本地方法。

内存分析:提供java应用程序内存使用信息,包括内存中已分配对象的数目、大小及活跃对象等信息,并附有对象分配时的栈追踪信息。

Oracle Solaris Studio Performance AnalyzerSolarisLinux平台上常用的性能分析工具,NetBeans Profiler(VisualVM)Windows平台常用的java性能分析工具。

2.性能分析常用术语:

(1).开销(Overhead):指性能分析器收集性能数据所花费的时间,开销不同于执行应用程序的时间。

(2).调用树(Call Tree):为了动态展示程序运行过程中的调用关系,以栈形式构造的方法列表,在方法分析时查看调用树能准确定位热点事件;内存分析时查看调用树有助于理解java对象分配的上下文。

(3).包含时间(Inclusive time)Oracle Solaris Studio Performance Analyzer的术语,方法自身及其子调用方法的执行时间总和。

(4).独占时间(Exclusive time)Oracle Solaris Studio Performance Analyzer的术语,不包含此方法调用其他方法的时间开销。

(5).归因时间(Attributed time)Oracle Solaris Studio Performance Analyzer的术语,被某方法调用所产生的时间开销。

(6).内存泄露(Memory Leak)NetBeans Profiler(VisualVM)的术语,一个永远不再使用的对象由于等待一个或多个java对象对它的引用而不能被垃圾收集。

(7).自用时间(Self time)NetBeans Profiler(VisualVM)的术语,执行方法中的指令所消耗的时间,不包含本方法调用其他方法所消耗的时间,与Oracle Solaris Studio Performance Analyzer的独占时间类似。

(8).热点(Hot Spot)NetBeans Profiler(VisualVM)的术语,本耗时间较长的方法。

(9).根方法(Root Method)NetBeans Profiler(VisualVM)的术语,选定的进行性能分析的方法。

3.Oracle Solaris Studio Performance Analyzer简单使用:

(1).抓取性能数据:

A. 更新环境变量PATH,在其中加入Performance Analyzer工具,即把Performance Analyzer安装路径下的bin目录添加到环境变量PATH中。

B. 在启动java应用程序的java命令行或启动脚本中java命令之前添加collect -j启动java应用程序。例如:

$ collect -j on java -Xmx1g -cp SPECjbb2005.jar spec.jbb.Main

C. 运行java应用程序,使用Performance Analyzer工具的collect命令采集样本数据并生成样本文件,默认情况下样本文件存放在java应用程序启动目录下的test.xx.er文件中。

collect -j命令有很多参数选项,-o指定样本文件名称,-d指定样本文件存放目录等等。例如:

$ collect -j on -d /tmp -o specjbb2005.er java -Xmx1g -cp SPECjbb2005.jar spec.jbb.Main

D. collect -j可以使用-y参数控制性能数据采集的启停,-y参数常用SIGUSR2操作系统信号作为参数。执行如下命令可以使应用程序处于运行态但不采集性能数据:

$ collect -j on -y SIGUSR2 java -Xmx1g -cp SPECjbb2005.jar spec.jbb.Main

在另一个命令行窗口查找collect运行起来的java进程号命令如下:

ps -ef | grep Xruncollector

通过如下命令可以启动或停止性能数据采集:

kill -SIGUSR2 <java process id> 

(2).查看性能数据:

A. 通过Performance Analyzer图形化工具查看性能数据:

使用analyzer命令在图形化界面选择性能样本文件,或者使用analyzer <性能样本文件名>打开载入性能样本文件的图形化界面。

在图形化界面中的FunctionsCallers-CalleesCall-Tree选项卡查看方法的独占时间、包含时间、归因时间、系统态CPU时间、用户态CPU时间等性能指标。

B. 通过命令行工具er_print查看性能数据:

er_print命令可以将性能指标统计结果输出到标准输出,可以利用脚本编程将性能分析过程自动化,er_print的命令格式如下:

er_print [-script <script name> | -command <er_print command> | - | -V] <性能样本文件名>

其中”-V”前面的”-”表示从键盘输入中读取er_print命令,用于交互式命令解析,默认不提供任何命令选项或脚本时就进入交互式命令解析;”-V”是显示er_print版本信息之后退出。

具体的er_print使用可以参考帮助文档。

4.VisualVM(NetBeans Profiler)性能分析:

VisualVMNetBeans Profiler的功能类似,以VisualVM为例简单简绍性能分析过程,点击VisualVM”Profiler”可以可以对CPU、内存进行性能采样分析。

(1).CPU性能分析如下图:


CPU分析即方法分析,默认按自用时间降序排列,若想了解更详细消息,可以使用快照功能,对CPU性能分析生成快照,快照窗口默认选项卡是调用树,还可以切换到热点、组合及信息选项卡。

(2).内存性能分析界面如下图:


A.活动字节:显示活动对象使用的堆内存大小,一列以图表形式显示,一列以文字形式显示。

B.活动对象:当前堆上分配的对象数目。

C.年代数:根据活动对象进行统计,对象年龄是该对象经历的垃圾收集次数,代的值是活动对象按年龄大小分成不同代之后的代个数。

使用年代数发现内存泄露问题:

为了了解内存分析结果中的年代数这一列含义,必须了解JVM垃圾收集过程,每次垃圾收集器运行时,一个对象或者是存活下来,继续占用堆内存,则它的年龄会加1;或者是被移除,其内存也被释放。即可以把对象的年龄简单理解为它经历过的垃圾收集次数。年代数是不同的对象年龄数,例如应用程序第一次启动时为几个对象分配了空间,这些对象经历了80次垃圾收集,即对象年龄为80;在执行过程中又分配了第二组对象,这些对象经历了40次垃圾收集,即对象年龄为40;最后又第三组对象被分配,这些对象经历1次垃圾收集,即对象年龄为1。则代个数为3,因为堆上所有的对象只有三个不同的年龄:80401。在大多数java应用中,代个数最终会稳定下来,这是因为应用程序的持久对象已经分配完成,而生命周期较短的对象很快会被垃圾收集,所以不会对代个数产生影响,若应用程序中的代个数随着程序运行持续增长,则很可能是发生了内存泄露,即应用程序随着时间推进不断地分配对象,每个对象因为经历不同的垃圾收集周期而拥有不同的年龄,说明对象没有被正确地回收。

若想了解更详细消息,可以使用快照功能,对内存性能分析生成快照。

对于远程监控,需要使用VisualVMJMX远程连接,界面及操作与本地性能监控类似。

猜你喜欢

转载自blog.csdn.net/chjttony/article/details/45896383