开发自动化系列-工具集(二)系统性能监控工具

摘    要

孔子云:工欲善其事,必先利其器。作为开发人员,我们致力于为最终用户实现工作流程自动化;然而,许多开发人员却疏忽了将自己的开发流程自动化。企业级应用系统涉及到开发、测试、部署、实施等一系列开发流程,在整个软件开发过程中我们如何借助工具、方法和模式使过程简单自动化,减少一些低效繁琐的开发工作量。

本系列试图使用一系列的工具介绍帮助大家在日常工作中减轻繁杂低效的开发工作,借助于现有的一系列工具提升大家的开发效率,使大家日常工作做到事半功倍。

在 Java 程序的开发过程中,不可避免地会遇到内存使用、性能瓶颈等问题。Java Profiler 工具能帮助开发人员快速、有效地定位这些问题,因此成为了 Java 开发过程中的一个重要工具

本文作为该系列的第二章,介绍Java EE应用的系统性能监控工具JProfiler,JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。通过介绍这个工具的使用,帮助开发人员发现系统应用的性能瓶颈,提升系统运行性能。

一、 JProfiler是什么?

JProfiler是一个全功能的 Java 剖析工具( profiler ),专用于分析 J2SE 和 J2EE 应用程序。它把 CPU 、执行绪和内存的剖析组合在一个强大的应用中。 JProfiler 可提供许多 IDE 整合和应用服务器整合用途。 JProfiler 直觉式的 GUI 让你可以找到效能瓶颈、抓出内存漏失 (memory leaks) 、并解决执行绪的问题。它让你得以对 heap walker 作资源回收器的 root analysis ,可以轻易找出内存溢出; heap 快照( snapshot )模式让未被参照( reference )的对象、稍微被参照的对象、或在终结( finalization )队列的对象 都会被移除;整合精灵以便剖析浏览器的 Java 外挂功能。

JProfiler的原理首先在于JProfiler使用JVM提供的JVMPI虚拟机监视接口,它是一个用于JVM与监控程序之间双向调用的接口,双向是指JVMPI一方面提供事件的方式通知监控程序JVM的信息(如堆分配、线程启动等),另一方面也提供方法让监控程序主动请求获得JVM更多的信息。其次,JProfiler还提供探查代理,从传输协议中获取各种监控信息。

二、 JProfiler能做些什么?

从功能上而言,JProfiler提供了以下功能:

l 内存消耗的测量

l 内存堆栈跟踪

l CPU负载分析

l 瞬时堆分配信息

l 线程分析

l 虚拟机负载可视化监控

l GC分析

l 通过远程进行分析

JProfilerJVM收集到的信息通过GUI可以让用户通过观察获取当前应用的JVM各种情况,从而进行性能调优,比如找到哪个对象占用的内存比较多;哪个方法占用CPU资源比较多,服务器线程状态、是否存在阻塞问题,服务器是否存在内存泄漏等问题。

三、 JProfiler怎么用?

JProfiler可以对Java应用、服务器应用进行分析,而且也支持对服务器进行远程的监控,综合公司情况,现主要介绍监听本地Weblogic服务器。

JProfiler 7.1.2  安装后输入注册码(这里使用的是破解版)

1. 监听本地Weblogic服务



新建配置


选择Weblogic





选择On this computer


选择JVM,模式使用hotspot


三种模式,第一种是手动连接,手动启动Weblogic服务器后再使用JProfiler连接,第二种是捆绑Weblogic启动文件,JProfiler同时启动服务和监听,第三种是通过快照实现离线监听,配置好触发器记录监控数据后通过离线月度监控报告,这里采用第一种。

选择Weblogic启动文件。

接下来继续点下一步知道完成即可,完成后在服务器域下会生成一个针对JProfiler的执行文件startWebLogic_jprofiler.cmd,而实际上这里只是把这个执行文件加入以下配置。


set JPROFILER_OPTIONS=-agentpath:C:\PROGRA~1\JPROFI~1\bin\windows\jprofilerti.dll=port=8849 %JPROFILER_OPTIONS%

点击这个startWebLogic_jprofiler.cmd启动服务,在JProfiler进入StartCenter


启动配置好的会话


显示这个页面表示连接成功


四、 JProfiler怎么去分析

1 内存视图

JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。

图中是JProfiler的内存视图,通过过滤器设置过滤报名com.comtop可以获得系统代码在服务器中的内存占用情况,这里可以看到CIMObjectIdMap在内存中有着海量的实体,也占用了11M内存,经分析可以推测CIMObjectIdMap这个台帐Id映射对象是把数据库的内容缓存到内存中供台帐模块的快速调用。


根据内存视图可以看到服务器的内存主要被那些对象占用,可以找出一些内存开销特别大的类、以及分析造成内存泄漏的问题。


内存视图下的功能模块

ü 所有对象(All Objects) :显示类或在状况统计和尺码信息堆上所有对象的包。你可以标记当前值并显示差异值。 

ü 记录对象(Record objects) :显示类或所有已记录对象的包。你可以标记出当前值并且显示差异值。 

ü 分配访问树(Allocation call tree):显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。 

ü 分配热点(Allocation hot spots) :显示一个列表,包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值。对于每个热点都可以显示它的跟踪记录树。


2 堆遍历(Heap walker 

JProfiler的堆遍历器(Heap walker),你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。堆遍历器包括五个视图,如下: 

ü 类Classes:显示所有类和它们的实例。 

ü 分配Allocations:为所有记录对象显示分配树和分配热点。 

ü 索引References:为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。 

ü 数据Data:为单个对象显示实例和类数据。 

ü 时间Time:显示一个对已记录对象的解决时间的柱状图。


3 CPU视图(CPU Views 

   JProfiler 提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。CPU视图部分包括: 

ü 访问树Call tree:显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。JDBC,JMSJNDI服务请求都被注释在请求树中。请求树可以根据ServletJSPURL的不同需要进行拆分。 

ü 热点Hot spots:显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBCJMSJNDI服务请求以及按照URL请求来进行计算。 

ü 访问图Call graph :显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。

比如下图,服务器启动时的CIMSchemaLoadServlet,可以查看到这个方法一直占用CPU资源,这个台帐的cim模型相关的方法,可以跟踪到具体执行开销到那个方法上,从而进行性能优化。

通过hot spots视图 可以发现当前消耗时间最多的方法列表,从而找到性能改进突破点,如下面的getAttributeValueType方法是目前最耗性能的方法。

再查看Call Graph视图,可以分析某个方法的性能开销细节。

4 线程视图(Thread Views

线程视图可以查看服务的线程运行情况,可以对服务器的情况进行分析,也可以对线程造成的服务器问题进行分析。

线程历史(Thread History显示一个与线程活动和线程状态在一起的活动时间表。查看线程在服务器的运行情况、线程的运行历史,可以在时间轴上查看线程等待、阻塞等等的情况。

线程监控(Thread Monitor显示一个列表,包括所有的活动线程以及它们目前的活动状况.查看线程的总体情况,包括线程创建的调用栈。

线程转存(Thread DumpsDump出某个时刻的所有线程,把当前线程模型记录一个快照。

服务器线程的运行情况(橙色是等待状态,青色是Net I/O线程)。


5 监视器视图(Monitor Views

暂未发现该视图的具体可用场景。


6 VM遥感勘测视图(VM Telemetry Views)

这个主要是针对虚拟机的各种纬度监测视图。这里只能对机器进行一个整体情况的观察,并没有更细的问题跟踪功能。

ü 内存 Memory:显示服务器的内存情况的时间表,这里主要针对的是JVM的各内存分区的可用、已用内存大小。可选堆内存(Heap包括 PS Eden Space年轻代,PS OLD Gen年老代,PS Survivor交换区)的内存使用和回收情况。 或非堆内存(Non-Heap 包括Code CachePS Perm Gen

ü 记录的对象 Recorded objects:显示一张关于活动对象与数组的图表的活动时间表。 

ü 对象吞吐量 Recorded Throughput:显示一张记录每秒创建对象和销毁对象的速度的活动时间表。 

ü 垃圾回收 GC Activity:GC所占cpu情况

ü 类 Classes:显示一个与已装载类的图表的活动时间表。 

ü 线程 Threads:显示一个与动态线程图表的活动时间表。 

ü CPU Load:目前工程占用系统cpu状态。


7 系统探侦 JEE & Probes

这是JProfile 7 的新特性,专门针对JavaWeb应用而设,可以针对JDBCJNDIJMSServletSocketsProcessess的情况进行分析。展示的视图有时间线、概览、热点监测(针对耗时和发生次数)、勘测(吞吐量、创建数等等内容的监测)。

监测JDBC

可以查看Time Line 查看服务器对数据库的连接情况,可以分析服务器是否有连接数量是否正常、是否存在未关闭的连接等等。

通过热点(Hot Spots)可以监测某段SQL语句的执行耗时


l JNDI 

可以监测JNDI可以监测某项资源的请求调用情况。

这里可以看到从某个JSP的请求,可以看到每个JSP都被两个过滤器处理。


l JMS

这里可以监控服务器的消息服务情况。


l Servlets 

这里可以监测服务器Servlet或者JSP请求情况,可以统计系统页面的访问时间以及访问次数,可以找到服务器耗时最大的页面。


l Sockets 

查看服务器的SocketIO操作情况,可以监测、分析连接服务器的客户端情况。

如下图,在Socket监测下,可以得到服务器的数据库连接信息、客户端连接、客户端请求内容等等。




五、 JProfiler的离线记录功能

由于现场环境和测试通过长期监测的方式去分析问题有一定的限制,因为不可能长时间守候监视程序,因此这里介绍一个JProfiler提供的离线监测功能。通过配置不同的触发器,在不同条件下触发数据记录(如服务器启动时开始记录、服务器关闭时停止记录并保存)。数据通过快照文件的方式存放,通过分析快照文件即可对服务器的运行情况进行研究。

具体配置方式如下:


同样按照上述的方式新建一个新的配置,在这一页配置项选择第三项(注意,采用离线监测的方式时,将不能够实时连接服务器进行监控)。









打开StartCenter ,选中刚刚新建的Session,点击编辑按钮进入编辑页面。

选择Triggers Settings ,点击新建按钮新建触发器,根据需要建立触发器。



这里就定义了两个触发器:服务器启动时触发开始记录数据,服务关闭时结束数据记录并保存。

定义完成后,打开startWebLogic_jprofiler.cmd即按照配置进行数据记录。


以保存的快照文件,通过Session->Open Snapshot打开快照即可打开记录的快照数据。


触发器能够根据以下条件触发:

ü 监听某个类的某个方法,当这个方法被调用时触发。

ü 虚拟机内存达到一定值时触发(如当应用的内存值达到一个异常值时)。

ü CPU负荷达到一定值时触发。

ü 应用发生Out of memory exception时触发。

ü 定时触发,每隔一段时间触发。


因此,根据以上触发器,可以构建以下典型的用法:

ü 当服务器内存占用或者CPU负荷达到一定异常值时,记录当前的系统各项指标的快照,找到导致问题的原因。

ü 实现由人手触发生成的系统当前指标报告。

ü 定时收集服务器运行情况数据。

ü 当出现问题时记录问题的现场情况。



六、 总结

综合对JProfiler的多方面研究,得出以下结论,

1. JProfiler的功能可以完成以下典型的性能调优工作:系统的SQL性能调优、代码内存占用调优、代码性能调优、多线程调试、Web服务的优化及分析等等,按照快照方式也可以实现服务器异常(CPU占用异常、内存占用异常甚至宕机)时现场情况采集。

2. JProfiler适用性十分广,既可以用于开发组的代码级别的性能调优和代码分析,也可以用于产品级的服务器监控、问题预防,建议开发组、配置管理组尝试投入使用,也可以作为技术管理组对代码性能调优的重要数据来源。

3. JProfiler的使用不算困难,开发组具备能力发布并对自己本地的系统进行分析和性能调优,而配置管理组也可以在测试环境中配置JProfiler,定期输出运行报告作为性能分析和性能调优。

七、 参考资料

1.JProfiler  http://www.ej-technologies.com/products/jprofiler/overview.html

你可能感兴趣的:(开发自动化系列-工具集(二)系统性能监控工具)