Websphere提供了一个TPTP(Test & Performance Tools Platform)工具,最新版本为4.5.0,可以进行强大的性能测试和分析工具,利用它,我们可以分析java代码的内存泄露分析、查找性能瓶颈、以及定位线程死锁等。
一、准备工作
1、下载TPTP工具
Websphere提供了一个TPTP Eclipse插件,可以到下面的网站进行下载。
http://www.eclipse.org/tptp/home/downloads/
为了简便起见,建议直接下载TPTP all-in-one package,这是一个含有TPTP插件的3.4版本的Eclipse,下载后直接解压后,运行该目录下的eclipse.exe就可以直接运行。
2、下载示例项目
为了学习插件的功能,建议下载示例项目,在该网站中,找到"TPTP Project Examples",点击"Runtime"下载示例项目。下载后解压后,分别将几个项目导入到带有TPTP插件的Eclipse的工作空间中。
3、下载Agent Controller
Agent Controller用于监控外部的Java应用,如监控Websphere Application Server。
在下载页面找到Agent Controller,在Runtime 选择Windows IA32(windows平台的32位操作系统),按"download"按钮即可下载。
下载后,将其解压到一个,如 d:\agentcontrol
二、进行Java程序的性能分析和监测。
下面具体来通过案例学习如何使用TPTP工具。
1、进行内存泄露分析
以Profile方式运行Memory Leak项目的MemoryLeak类。
首先选择Window -> Open Perspective -> Profiling and Logging, 打开Profiling透视图。选择Run -> Profile configurations (也可以点击 图标进行选择),打开Profile设置对话框,选择External Java Application,按 按钮,增加了一项新的配置New_configuration,在main Tab页选择Memory Leak 项目中的类MemoryLeak class文件,选择Memory Leak项目,找到MemoryLeak类并选择,如下图所示。
再按"Monitor"Tab页,选择"Java Profiling--Memory Analysis",如下图所示,再按"Profile"按钮,运行应用并进行监控。
该应用运行了一个Applet窗口,如下图:
Profile的透视图如下图所示,不断按Leak some memory或Allocate some memory按钮,可以不断增加内存中集合的Sting实例和new String实例,双击左侧视图MemoryLeak at fox,右侧实体显示内存分析结果,按Profiling视图的 图标,手动刷新页面,可以看到有上、下小箭头,预示着活动的内存实例数(Live Instance)和总内存实例数(Total Instance)的增加和减少(垃圾收集造成),以及各个类占用的字节数。按Object Allocations视图的%后的三角形图标,可以看到增加量和减少量的变动值,如下图所示。
2、执行时间分析:用来分析程序的执行时间,分析性能瓶颈。
以Profile方式运行MemoryLeak类,步骤同上,在Monitor Tab页面选择"Java Profiling---Execution Time Analysis",按"Profile"按钮,弹出运行的页面。
双击左侧视图中MemoryLeak at fox的Execution Time Analysis,显示执行分析页面,如下图所示:
点击Call Tree Tab页面,看以看到调用关系,并可视化显示出调用的时间长短,如下图所示。
点击左侧的配置资源项的鼠标右键菜单,选择"Open With---Execution Flow",可以显示图形化的调用时间关系,用鼠标选中一个区域,可以将其放大,如下图所示:
可以看出,这是一个很好的性能分析工具,另外还具有生成类似UML的类交互图和线程交互图的功能。
3、线程分析:可以分析出死锁和运行的历史状况。
以Profiling方式运行ThreadsDeadlock项目中的Deadlock类,Monitor选择Thread Analysis,进行Profiling监控。双击击左侧视图的DeadLock At fox,显示线程的状态,如下图所示:
可以看出,图中直接标明了哪些线程正在运行,哪些线程在等待、哪些线程停止、哪些线程发生了死锁。
更强大的功能还在后面,点击Threads Visualizer Tab页,可以看出线程在时间执行序列上的状态变化情况,如下图所示:
时间轴从左到右,单位为 秒:毫秒,各种演示代表不同的状态:
- 绿色为运行状态
- 红色为死锁状态
- 黑色为停止状态
- 橙色为等待状态
图中显示了各个线程在不同时间段的状态变化。
三、对WebSphere 应用服务器进行监控
TFTP不仅可以对Java程序进行监控,还可以对外部的应用服务器进行监控,如WebSphere应用服务器。
1、 设置环境变量
为了监控Websphere,需要先增加新的环境变量,直接编辑websphere的server.xml文件,笔者的配置文件如下:
D:\JavaEEServer\IBM\Websphere6.1\profiles\AppSrv03\config\cells\foxNode02Cell\nodes\foxNode03\servers\server1\server.xml
修改配置文件的jvmEntries选项的属性genericJvmArguments,如:
genericJvmArguments="-Xquickstart -XrunpiAgent"
2、 将d:\agentcontroll\bin目录下的dll文件copy到jdk的bin目录中
笔者的jdk\bin目录为
D:\JavaEEServer\IBM\Websphere6.1\java\bin (按照AgentController的readme,只设置环境变量是不能运行的,查了Sun的资料,发现可以将dll文件copy到bin目录下,这样就可以执行了)。
3、 启动Websphere。
这样,websphere上就运行了一个外部的Agent代理。
4、使用Eclipse连接Agent。
选择Run---Profile configurations,打开Profile设置对话框,选择Attach to Agent,按"+"按钮,增加一项配置,Host缺省为localhost[10002],因为是本机所以不用修改,如果要连远程集群,需要修改IP地址。点击Agent Tab页,选中Java Profiling中的三项,按"Profile"按钮进行监控。如下图所示。监控结果可以显示出内存分析、执行时间执行方法覆盖情况等信息,如下图所示。
监控结果可以显示出内存分析、执行时间执行方法覆盖情况等信息,如下图所示。