• 1. 基于JAVA的性能诊断和分析工具—JProfiler的基本操作和配置
  • 2. 目录一、JProfiler基本介绍 二、JProfiler的主要功能模块介绍 三、JProfiler对本地tomcat的监控 四、JProfiler对远程tomcat的监控 五、JProfiler对本地websphere的监控 六、JProfiler对远程websphere的监控 七、与IDE的集成 八、实战操作演练
  • 3. JProfiler基本介绍JProfiler 是一个著名的用于 java 系统监控分析的软件,功能很强大,可以监控普通的java application, applet,java web start,application server等等。 JProfiler通过实时监视系统的内存使用情况、垃圾回收情况和线程运行状况,从而很好的监视JVM运行情况及其性能。 除了可以监控本地的程序,还可以对远程服务器上跑的应用进行监控。
  • 4. JProfiler基本介绍JProfiler直觉式的 GUI 可以让用户通过视觉上的观察,可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用的热点、即:哪个对象占用的内存比较多;或者CPU热点,即:哪个方法占用CPU资源比较多。这样就能方便的找到瓶颈和内存漏失等问题。
  • 5. JProfiler的功能模块内存视图(Memory Views) 堆遍历(Heap Walker) CPU视图(CPU Views ) 线程视图(Thread Views ) 监视器视图(Monitor Views ) VM遥感勘测技术(VM Telemetry Views )
  • 6. JProfiler的功能模块内存视图(Memory Views) JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
  • 7. 内存视图
  • 8. JProfiler的功能模块内存视图 (Memory Views) 所有对象 :显示类或在状况统计和尺码信息堆上所有对象的包。你可以标记当前值并显示差异值。 记录对象(Record objects) :显示类或所有已记录对象的包。你可以标记出当前值并且显示差异值。 分配访问树(Allocation call tree):显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。 分配热点(Allocation hot spots) :显示一个列表,包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值。对于每个热点都可以显示它的跟踪记录树。
  • 9. JProfiler的功能模块堆遍历(Heap walker) 在JProfiler的堆遍历器(Heap walker)中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。堆遍历器包括五个视图,如下:
  • 10. 堆遍历(Heap walker)
  • 11. JProfiler的功能模块堆遍历 Heap walker 类Classes:显示所有类和它们的实例。 分配Allocations:为所有记录对象显示分配树和分配热点。 索引References:为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。 数据Data:为单个对象显示实例和类数据。 时间Time:显示一个对已记录对象的解决时间的柱状图。
  • 12. JProfiler的功能模块CPU视图(CPU Views) JProfiler 提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。CPU视图部分包括:
  • 13. CPU视图(CPU Views)
  • 14. JProfiler的功能模块CPU视图(CPU Views) 访问树Call tree:显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。JDBC,JMS和JNDI服务请求都被注释在请求树中。请求树可以根据Servlet和JSP对URL的不同需要进行拆分。 热点Hot spots:显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBC,JMS和JNDI服务请求以及按照URL请求来进行计算。 访问图Call graph :显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。
  • 15. JProfiler的功能模块线程视图(Thread Views) 线程历史Thread history:显示一个与线程活动和线程状态在一起的活动时间表。 线程监控 Thread monitor:显示一个列表,包括所有的活动线程以及它们目前的活动状况。 死锁探测图表Deadlock Detection:显示一个包含了所有在JVM里的死锁图表。 目前使用的监测器Current monitor useage:显示目前使用的监测器并且包括它们的关联线程。 历史检测记录 History usage history:显示重大的等待事件和阻塞事件的历史记录。 监测使用状态 Monitor usage statistics:显示分组监测,线程和监测类的统计监测数据。
  • 16. 线程视图(Thread Views)
  • 17. JProfiler的功能模块监视器视图(Monitor Views)
  • 18. JProfiler的功能模块VM遥感勘测技术(VM Telemetry Views) 堆 Heap:显示一个堆的使用状况和堆尺寸大小活动时间表。 记录的对象 Recorded objects:显示一张关于活动对象与数组的图表的活动时间表。 垃圾回收 Garbage collector:显示一张关于垃圾回收活动的活动时间表。 类 Classes:显示一个与已装载类的图表的活动时间表。 线程 Threads:显示一个与动态线程图表的活动时间表。
  • 19. VM遥感勘测技术(VM Telemetry Views)
  • 20. JProfiler对本地tomcat的监控(windows平台)前提条件 安装好tomcat并配置好环境变量。 安装好JDK并配置好环境变量,JDK版本最好是1.6版本的,如果是1.5及以下版本,可能会不支持中文目录 。
  • 21. JProfiler对本地tomcat的监控(windows平台)操作步骤 1、点击工具栏上的Start Center,然后点击New Session标签,如图所示:
  • 22. JProfiler对本地tomcat的监控(windows平台)2、点击Integration Wizards下的New Server Integration,打开Integration Wizards页面,选择tomcat的版本,这里选择Apache Tomact 6.x(如果是带有tomcat6.exe的版本,则选择Apache Tomact 6.x (with tomcat6.exe )),然后点击Next按钮,(注意:如果是64位的JVM,则需要勾选上“64 bit JVM”)
  • 23. JProfiler对本地tomcat的监控(windows平台)3、在The profiled application is located下选择On this computer,点击Next,如图:
  • 24. JProfiler对本地tomcat的监控(windows平台)4、选择JVM提供商、版本和模式,JVM Vendor选择Sun,Version选择1.6.0,Mode选择默认值hotspot,点击Next,
  • 25. JProfiler对本地tomcat的监控(windows平台)5、在Startup mode下选择第二项,即Startup immediately,connect later with the JProfiler GUI,点击Next,如图:
  • 26. JProfiler对本地tomcat的监控(windows平台)6、在Locate the start script,点击浏览,选择tomcat的启动脚本,如startup.bat,点击Next按钮,(注意: startup.bat 一般位于bin目录下);
  • 27. JProfiler对本地tomcat的监控(windows平台)7、选择默认端口8849,点击 Next,然后继续点击Next; 8、选择Yes,start the session and wait for the application server,然后点击Finish, 9、然后在Session Startup页面上勾选上Record CPU data on startup和 Record allocations on startup两个复选框,点击OK按钮,对本地tomcat的配置完成,如图
  • 28. JProfiler对本地tomcat的监控(windows平台)
  • 29. JProfiler对本地tomcat的监控(windows平台)特别注意: jprofiler对tomcat的监控配置完成以后,会自动在tomcat的bin目录下产生一个startup_jprofiler.bat文件,在监控之前,必须启动该批处理文件而不是startup.bat,才能实现对tomcat的成功监控,切记!
  • 30. JProfiler远程tomcat的监控(windows平台)前提条件 远程服务器已安装好JProfiler软件; 远程服务器已安装好JDK并配置好环境变量。 远程服务器已安装好tomcat并配置好环境变量
  • 31. JProfiler对远程tomcat的监控(windows平台) 操作步骤跟监控本地tomcat的步骤基本差不多,主要有以下几个地方不同,需要注意一下: 1、在第二步选择服务器的位置时应该选“远程机器”,如图
  • 32. JProfiler对远程tomcat的监控(windows平台)2、在第五步需要输入的是远程服务器的地址,如图:
  • 33. JProfiler对远程tomcat的监控(windows平台)3、在第六步时需要指定远程服务器上jprofiler的安装目录,如:F:\jprofiler。
  • 34. JProfiler对远程tomcat的监控(windows平台)4、在第七步“locate the start script”,需要将远程服务器上的startup.bat文件拷到本地,点击浏览按钮并选中它,点击确定,如图:
  • 35. 对本地websphere的监控(windows平台)前提条件 本地已安装好websphere6;
  • 36. 对本地websphere的监控(windows平台)操作步骤 1、点击工具栏上的Start Center,然后点击New Session标签,如图所示:
  • 37. 对本地websphere的监控(windows平台)2、点击Integration Wizards下的New Server Integration,打开choose integration Wizard页面,选择websphere的版本,这里选IBM websphere6.0 application server,如图所示;
  • 38. 对本地websphere的监控(windows平台)3、在The profiled application is located下选择On this computer,点击Next,如图:
  • 39. 对本地websphere的监控(windows平台)4、选择JVM提供商、版本和模式,都选择默认值不要改变,点击Next,
  • 40. 对本地websphere的监控(windows平台)5、在Startup mode下选择第二项,即Startup immediately,connect later with the JProfiler GUI,点击Next,如图:
  • 41. 对本地websphere的监控(windows平台)6、在第五步locate config file里选定server.xml文件,然后点击next,(注意:该文件一般位于\profiles\AppSrv01\config\cells\talkweb-testgd11122Node01Cell\nodes\talkweb-test\servers\server1目录下),如图所示:
  • 42. 对本地websphere的监控(windows平台)7、在第六步locate the start script里选定startServer.bat,然后点击next,(注意:该文件位于bin目录下)
  • 43. 对本地websphere的监控(windows平台)8、选择默认端口8849,点击 Next,然后继续点击Next; 9、选择Yes,start the session and wait for the application server,然后点击Finish, 10、然后在Session Startup页面上勾选上Record CPU data on startup和 Record allocations on startup两个复选框,点击OK按钮,对本地websphere的配置完成。
  • 44. 对本地websphere的监控(windows平台)特别注意: 在配置之前一定要把websphere的服务停掉,如果是注册为windows服务的话,需要把该服务停掉并将其属性设置为“禁用”。
  • 45. 对远程websphere的监控(windows平台)前提条件: 远程机器已安装好websphere6.0 ; 远程机器已安装好jprofiler6.
  • 46. 对远程websphere的监控(windows平台)操作步骤跟监控本地websphere的步骤基本差不多,主要有以下几个地方不同,需要注意一下: 1、在第二步选择服务器的位置时应该选“远程机器”,如图
  • 47. 对远程websphere的监控(windows平台)2、在第五步需要输入的是远程服务器的地址,如图:
  • 48. 对远程websphere的监控(windows平台)3、在第六步时需要指定远程服务器上jprofiler的安装目录,如:F:\jprofiler,
  • 49. 对远程websphere的监控(windows平台)4、在第七步时需要指定配置文件的同步方式,这里选第二种方式,如图所示:
  • 50. 对远程websphere的监控(windows平台)5、第八步locate config file,需要把远程机器上的配置文件拷贝到本机,然后选定它,点击确定,然后点击next,
  • 51. 对远程websphere的监控(windows平台)6、第九步locate start script,也需要把远程机器上的startServer.bat文件拷贝到本机,选定它然后点击确定,
  • 52. 对远程websphere的监控(windows平台)注意: 如果远程连接不成功,请检查: 1、本地和监控机是否都安装了JProfiler,版本是否相同; 2、本地和监控机的端口是否一致,最好都使用默认的8849端口; 3、所选JVM的提供商和版本是否一致,可能机器上有多个JAVA版本,一定要选择应用程序启动时所用的; 4、应用目录必须可写共享,监控机需要映射共享目录,配置完成后在本地机器上会生成JProfiler监控的启动文件。
  • 53. 与IDE的集成可以与Eclipse集成; 可以与Jbuilder集成; 可以与IBM WASD和IBM RAD集成; 可以与Oracle JDeveloper集成;
  • 54. 与IDE的集成以与Eclipse3.2的集成为例 (注意:执行集成之前需要关闭Eclipse!) 操作步骤: 1、点击主菜单–> Session –>IDE Intergrations
  • 55. 与IDE的集成2、选择Eclipse的版本,这里以3.2版本为例,如图所示:
  • 56. 与IDE的集成3、点击“Integrate” ,选择Eclipse所在的文件夹。如:D:\apache-tomcat-6.0.32\eclipse,点击确定; 4、以D:\apache-tomcat-6.0.32\eclipse\eclipse.exe – clean 方式启动eclipse(目的是清除插件缓存,仅需第一次加此参数);
  • 57. 与IDE的集成5、在Eclipse里配置JProfiler 点击主菜单–>Window–>Customize Perspective–>Commands ,找到Profile ,选中它,再点OK即可,如图所示:
  • 58. 与IDE的集成6、运行测试,选择你要测试的系统的主类,右击profile as-->Java Application运行即可。
  • 59. 实战操作演练(一)、任务目标: 找出项目中内存增大的原因。
  • 60. 实战操作演练(二)、配置说明 操作系统:WindowsXP Web容器:Tomcat6.0.32 JDK版本:Sun JDK1.6.0 监控类型:本地 Jprofiler安装路径:C:\ProgramFiles\jprofiler6 Tomcat安装路径: D:\apache-tomcat-6.0.32\apache-tomcat-6.0.32
  • 61. 实战操作演练(三) 、 测试项目 1、新建WEB项目test 2、建包cn.test 3、在该包下建类文件TestMain.java 和 TestBean.java package cn.test; public class TestBean { String name = ""; public static void main(String[] args){ System.out.println("test"); }   package cn.test; import java.util.ArrayList; public class TestMain { public static ArrayList list = new ArrayList(); //存放对象的容器 public static int counter = 0;    //作统计用 }
  • 62. 实战操作演练4、建测试用的JSP文件init1.jsp、init2.jsp Init1.jsp(每次执行都创建1万个TestBean对象) <%@ page language="java" import="cn.test.*" pageEncoding="ISO-8859-1"%> init <% for(int i=0;i<10000;i++){ TestBean b = new TestBean(); TestMain.list.add(b); } %> SIZE:<%=TestMain.list.size()%>
    counter:<%=TestMain.counter++%> 注:Init2.jsp和init1.jsp一模一样即可(后面有用)。
  • 63. 实战操作演练(四) 、配置测试用例 具体操作:略
  • 64. 实战操作演练(五)、开始测试 1、在IE地址栏中输入: http://localhost:8080/test/init1.jsp, 执行一次,我们可以在内存视图中看到cn.test.TestBean对象被创建了10000次,如下图所示:
  • 65. 实战操作演练
  • 66. 实战操作演练2、标记现在的状态,然后再执行init1.jsp和,init2.jsp可以让我们找到哪些类在调用后没有被释放(很重要!!!)
  • 67. 实战操作演练刚才执行了4次init1.jsp和1次init2.jsp,正好产生了50000个TestBean对象,和图示显示的一样 (注:红色的变成是发生变化的对象及其数量)
  • 68. 实战操作演练3、过一会后,按F4键进行垃圾回收。但回收完成后,这些对象依然存在,说明某些地方对这个类的引用没有被释放! 4、找出是哪些地方使用了TestBean类,并且没有释放它们。 在cn.test.TestBean对象上点击右键选择“Show Selection in Heap Walker”, 然后点击确定,观察它的heap,
  • 69. 实战操作演练
  • 70. 实战操作演练Heap状态如图所示:
  • 71. 实战操作演练5、在该类中点击右键,在出现的菜单中选择“Use Selected Instances”,
  • 72. 实战操作演练6、出现如下窗口:
  • 73. 实战操作演练7、选择”Allocations”,点击“OK”,然后我们要的结果就出来了。图中显示调用此类的地方是init1.jsp和init2.jsp,并且各自占用的比率都列出来了。 既然问题的所在找出来了,接下来就该去解决问题了!
  • 74. 致谢