/>
PMAT在分析GC日志后,给出一个总结。
下图为例,我们可以看出GC对系统性能的影响,以及完成的垃圾回收次数等,并且我们可以看出工具给出的推荐(Recommendations)显示系统的Java堆使用情况是持续增加的。
进一步,我们可以查看GC的详情,点击Analysis菜单,然后选择GraphViewAll,我们就可以根据需要选择所要查看的曲线。
如图所示,红色曲线代表已使用内存,蓝色曲线代表每次垃圾回收后可用的内存。
已使用内存逐渐增加,可用内存的持续降低表明系统可能存在内存泄漏。
回页首
4.TPV监视JVM的状况
另外一种方法是借助TPV和PMI来实时监视JVM,分析性能曲线来判断是否有内存泄漏的状况发生。
WebSphere性能监控基础结构(PMI)和Java虚拟机概要分析工具接口(JVMTI)可以帮助我们收集系统的性能状况数据,使用Tivoli性能查看器(TPV)以图形的方式显示这些数据(性能计数器),可以进一步证实是否系统正在发生内存泄漏。
4.1PMI与TPV
PMI提供WebSphere运行时和应用程序资源行为的一组全面的数据,。
例如,PMI提供数据库连接池大小、servlet响应时间、EnterpriseJavaBeans(EJB)方法响应时间、Java虚拟机(JVM)垃圾回收时间以及CPU使用量等等。
使用PMI数据,可以识别并修正应用程序服务器中的性能瓶颈,还可使用PMI数据来监控应用程序服务器的运行状况。
PMI数据可以由TivoliPerformanceViewer(TPV)、其他Tivoli工具、您自己的应用程序或第三方工具来监控和分析。
TPV是随WebSphereApplicationServer一起提供的PMI数据图形查看器。
TivoliPerformanceViewer(TPV)使得我们可以通过查看图表或表格,从而解读WebSphere的性能监控基础结构(PMI)数据。
4.2PMI的配置方法
默认情况下,PMI已经开启,级别是默认(Default)。
配置步骤:
1.在控制台导航树中单击监视&调整->性能监视基础结构(PMI)。
2.选择所要配置的服务器名字。
3.单击配置选项卡,这里可以根据监控内容的需要,来选择PMI的任一种统计信息集(无,基本,扩展,全部,定制)。
我们这里选择"定制"。
注:
如果在配置选项卡中,则当重新启动服务器时应用设置。
如果在运行时选项卡中,则立即应用设置。
4.点击定制->在定制监视级别的树中,选择配置选项卡,然后点开JVM运行时,可以根据需要,启用或禁用相应的计数器。
5.保存并重启WebSphere服务器。
4.3TPV的使用方法
实时查看TPV性能模块的步骤:
(1)在控制台导航树中,单击监控和调整->性能查看器->当前活动->服务器名字)->性能模块。
(2)选中要查看的每个性能模块,例如JVM运行时。
(3)单击查看模块按钮。
在页面的右侧会显示所选性能数据的图形或切换成表格。
注:
每个模块有与其关联的多个计数器。
这些计数器会显示在数据图形或表格下面的表中。
您可以通过选择或取消选择计数器旁的复选框,将计数器添加到图表或表中,或从中除去。
TPV显示的已使用内存的图形理想情况下应该是锯齿状,图形中每个坡(下降)对应着一次内存的垃圾回收(Garbagecollection),如下图已使用内存的曲线,显示的是没有发生内存泄漏的状况。
如果测试过程中出现如下情况,则有可能发生了内存泄漏:
-每次垃圾回收后的已使用内存的数值骤增。
-TPV对应的已使用内存图形更接近于阶梯(staircase),或者锯齿形状严重不规则。
-也可以查看分配的对象数与释放的对象数之差值,如果这个数值越来越大,则有内存泄漏(如果需要查看对象数,需要启用JVMTI接口并在PMI中启用相应的JVM计数器)。
上图,红色曲线代表已使用的内存,从整体趋势,我们可以看出已使用内存一直在增长。
TPV可以帮助发现内存泄漏,为了得到最优结果,我们可以重复试验,而且每次可以增加测试的时间,例如测试1000,3000或5000个页面请求。
回页首
5.生成Heapdump文件
WAS6.1中,在使用IBMJDK的平台上,可以直接使用以下的方法,随时生成所需的heapdump文件。
如果在性能诊断顾问程序配置里面选中了"启用自动堆转储收集,则可以自动在WebSphereprofile所在的路径下(例如/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01)生成heapdump文件,备用户进行分析。
在使用IBMSDK的平台上,例如AIX,Linux和Windows,在启用了性能诊断顾问工具后,如果探测到有内存泄漏发生,WebSphere会自动生成两个heapdump文件,供后续分析使用。
我们在任何时候,可以随时手动生成所需的heapdump文件。
在WAS6.1profile的bin目录下,首先运行wsadmin脚本客户端,然后可以调用generateHeapDump操作来完成。
关键步骤:
1.找到JVM对象名字。
setobjectName
WebSphere:
type=JVM,process=,node=<节点名字>,*]
2.对JVMMBean调用generateHeapDump操作。
$AdminControlinvoke$objectNamegenerateHeapDump
例如:
[root@csspvmbin]#pwd
/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01/bin
[root@csspvmbin]#./wsadmin.sh-usernameroot-passworddemo4you
WASX7209I:
Connectedtoprocess"server1"onnodecsspvmNode02usingSOAP
connector;Thetypeofprocessis:
UnManagedProcess
WASX8011W:
AdminTaskobjectisnotavailable.
WASX7029I:
Forhelp,enter:
"$Helphelp"
wsadmin>setobjectName[$AdminControlqueryNames
WebSphere:
type=JVM,process=server1,node=csspvmNode02,*]
WebSphere:
name=JVM,process=server1,platform=proxy,node=csspvmNode02,
j2eeType=JVM,J2EEServer=server1,
version=6.1.0.0,type=JVM,mbeanIdentifier=JVM,cell=csspvmNode02Cell,spec=1.0
wsadmin>$AdminControlinvoke$objectNamegenerateHeapDump
/opt/IBM/WebSphere/WAS6.1/profiles/AppSrv01/./heapdump.20060904.075650.3576.phd
wsadmin>quit
理想情况下,在探测到问题时,尽快生成一个初始的heapdump,然后密切监控内存使用情况,等到泄漏了足够的内存的时候,再生成另外一个heapdump,这样可以对比分析以更准确地找到泄漏的原因。
注:
生成HeapDump文件的过程是比较耗资源的,所以请只在必须的时候做这样的操作。
回页首
6内存泄漏的分析诊断工具-MDD4J
一旦确定了系统中有内存泄漏,并且为此生成了heapdump。
接下来,我们可以把这些文件从WebSphere应用服务器转移到离线的分析工具所在的机器,进行离线分析诊断。
6.1工具介绍
MDD4J(MemoryDumpDiagnosticforJava)是一个内存泄漏分析工具,用于对运行WebSphereApplicationServer的虚拟机(JVM)所生成的常用内存转储(堆转储)格式进行分析。
进行内存转储(Memorydump)分析的目的,是为了确定Java堆中真正导致内存泄漏的类和包(classesandpackages),这样可以缩小内存泄漏的范围并找到真正的原因,此分析还确定应用程序Java堆占用量的主要组成部分以及它们之间的拥有关系。
此工具支持下列格式的内存转储格式有:
-IBM的PHD格式(heapdump.phd)
-IBM文本堆转储(heapdump.txt)
-HPROF堆转储格式(hprof.txt,主要针对Solaris和HP-UX平台)
-SVC转储(dump.bin,IBMz-Series上的WebSphere)
该工具提供了两种分析机制:
单转储分析以及对两个转储进行的比较分析。
单转储分析最常用于在发生OutOfMemoryException时自动触发的内存转储。
此类分析查找可疑的数据结构,能够相对快速地提供可疑泄漏对象的分析结果。
比较分析用于对运行内存泄漏应用程序期间(即可用Java堆内存流失时)获取的两个内存转储进行分析。
在运行泄漏应用程序的早期触发的内存转储被称为基线内存转储,发生泄漏的应用程序运行一段时间(以允许泄漏程度加大)后触发的内存转储被称为主内存转储。
在发生了内存泄漏的情况下,主内存转储可能包含大量对象,而这些对象占用的Java堆空间量会比基线内存转储大很多。
为了获得更好的分析结果,建议使主内存转储的触发点与基线内存转储的触发点在时间上拉开一定距离,从而使总耗用堆大小在两个触发点之间大幅增长。
MDD4J的分析结果显示是基于Web界面的,具有下列特征:
-列示分析结果、堆内容、大小和增长幅度的总结
-列示可疑的数据结构、数据类型和包,它们是造成堆使用量增加(对于比较分析)和堆大小较大(对于单转储分析)的主要原因。
-拥有关系上下文视图显示了占用量主要组成部分之间的关系,以及一组汇总的主要占用量组成部分所包含的重要数据类型。
-在堆转储内容的交互式树形视图中,浏览功能能够显示堆中任何对象的所有进入引用(在树中只显示一个引用,其余引用单独显示)和外出引用,而子对象按到达大小排序。
-导航功能使您能够从可疑对象列表转到所有关系上下文,以及从内容视图转到浏览视图。
-提供了内存转储中所有对象和数据类型的表视图,视图中具有过滤器和经过排序的列。
6.2工具的使用
WebSphere应用服务器v6.1的附带光盘里面有IBMSupportAssistant工具的安装文件,运行相应的安装文件,MDD4J作为插件同时被安装了。
另外,也可以从IBM技术支持站点下载SupportAssistant工具,然后选择更新程序,独立安装MDD4J插件。
启动步骤:
(1)程序->IBMSupportAssitant->IBMSupportAssistantv3
(2)在SupportAssistant窗口中,选择工具->选择WebSphere版本号。
点击MDD4J的链接,就可以开启MDD4J工具。
在该界面中,我们可以提交单个heapdump文件进行单转储分析,或同时提交两个文件进行比较分析。
也可以从内存转储分析结果的下拉选项中选择以前的分析结果,从而查看以前的分析内容。
查看分析进度
单击"上载并分析"按钮后,MDD4J开始分析heapdump文件。
在分析执行过程中,登录页面将自动刷新,以反映当前正在执行的分析步骤以及整体分析进度。
如果该页面由于某种原因而不刷新,您可以单击"刷新"按钮以了解当前分析状态。
如果您希望停止分析,可以单击"停止"按钮,这将在当前正在执行的模块完成后终止分析。
在提交了heapdump文件,MDD4J显示分析状态。
查看分析结果
分析完成后,Mdd4J页面将重定向到"分析结果"页面。
"分析结果"页面包含4个选项卡:
"分析总结"选项卡:
显示分析结果总结,并列示下一组用于查看分析结果的步骤。
"可疑对象"选项卡:
它显示四类可疑对象,即对增长幅度影响最大的数据结构、到达大小显著流失的数据结构、有大量实例的对象类型以及有大量对象实例的Java包。
"察看上下文和内容"选项卡:
显示主内存转储中Java堆占用量的主要组成部分的拥有关系上下文图,以及图中所选节点的内容。
"浏览"选项卡:
根据对对象引用图执行的深度优先遍历,用树形视图显