三、 Java 代码监控及分析工具

3.1 jporfiler

工具描述: J profiler java 开发软件性能测试工具 方便开发期测试开发软件的性能,提高开发效率,同时也保证软件性能。

优点:

1、  CPU,Thread,Memory分析功能尤其强大

2、  支持对jdbc,慢Sql监控,jsp, servlet, socket等进行分析

3、  支持多种模式(离线,在线)的分析

4、  支持IDEA、eclipse插件,若在生产过程中识别代码性能问题将能解决大部分性能问题。保守在30~50%左右。

5、 支持跨平台:windows、liunx、macos...

缺点:

1、在吞吐量很高的时候jprofiler工具自己也无法响应,本生也会消耗一定的性能。且在某些条件下还发现不了泄漏

2、jprofiler在启动的时候比较消耗服务器资源,单进程cpu%在100左右。

3、当接口响应较快时同一场景打开jprofler与不打开jprofiler cpu使用相差7~20%,内存使用率在20%左右。

4、jprofiler监控本身会将监控数据写入磁盘,5s写一次,请求较快时jprofile 要记录的东西比较多会导致监听服务进程异常终止。

注:性能测试过程中不建议打开,当存在问题可以打开监控采集数据。


3.2 jvisualvm

工具描述: Jdk 自带的jvm监控工具 jvisualvm 通过检测 JVM 中加载的类和对象信息等帮助分析内存使用情况

优点:

1 、不需要额外安装,只需要配置远程jmx连接即可。

2、JVM运行时的JVM参数、系统参数、堆栈、CPU使用等信息。可分析本地应用及远程应用

缺点: 不能监控慢sql。

3.3 MAT

工具描述: java 内存溢出性能分析工具

优点:

1、 支持IDEA插件

2、 单线的内存泄漏分要此功能比较有优势

缺点: 功能单一

四、安装

Class Tracker

显示选中类型对象的实例个数的曲线图

5.3 Heap Walker –堆遍历视图

该视图用于静态分析堆快照,在生成快照之前,会进行一次Full GC。包含以下选项卡:

Classes

类似于Memory Views的All Objects,可以显示快照中所有对象的数量、大小。右击选择Use Selected Instances,则可以显示单种类型的数据。

Allocations

分析对象分配情况:包括4种显示方式:Cumulated Allocation Tree:累积调用树,显示对象分配调用树,包含对象sizeAllocation Tree:调用树,显示对象分配调用树,包含对象sizeAllocation

Tree Map:以Tree Map形式显示调用树Allocation

Hot spots:显示分配对象最多的方法

Biggest Objects

显示占用内存最多的对象

References

显示单种类型的引用情况包含4种显示方式:Incoming references:其它对象对每一个选中对象的引用Outcoming references:每一个选中对象对其它对象的引用。Cumulated Incoming

references:显示其它对象、字段对选中对象类型的总体引用统计Cumulated 。Outcoming references:显示选中对象类型对其它对象、字段的总体引用统计。

Time

分析对象分配的消耗时间。

Inspections

提供多种精细的对象分配分析方式。

Graph

图形化方式显示对象的引用图。

5.4 CPU Views –CPU视图

该视图用于分析方法的CPU占用时间,通过执行时间越长则占用CPU的资源则越多包括以下选项卡:

Call Tree

显示自顶而下的调用堆栈的树,树的根是线程开始处,树的分叉表示的不同的调用路径。暗红色显示当前节点及其子节点消耗的时间、高亮红色显示本级节点消耗的时间。

显示未过滤类对过滤类的直接调用,不显示深入的调用,在被过滤类的左上角显示红三角。main方法、线程的run方法总是显示,不予过滤。

通过Profiling

Settings可以选择CPU时间的度量方式:Elapsed

time/Estimated CPU time,前者为Wall clock time(物理世界真实时间),后者为占用CPU的时间。由于操作系统的固有限制,10ms以下的时间可能不具有统计学意义。

界面右上角的Thread Status用于选择参与分析的线程状态,通常选择Runnable来分析性能问题,有时可以结合Net I/O、Blocked。

工具栏Start Tracking,可以追踪某些任务在不同线程之间的传递(调用点/执行点Call site/Execution site)

Hot Spots

显示方法调用的序列,包括某个方法的调用与被调用情况

Method Stat

点击工具栏图标,可以录制方法的统计信息并进行分析

Call Tracer

点击工具栏图标,可以对方法调用进行跟踪

5.5 Thread –线程视图

该视图用于分析线程的状态和历史分析、检测死锁,并可以获取线程快照,包含以下选项卡:

Thread History

线程状态时间线,可以选择显示活着的或者死去的线程。

绿色:Runnable :表示线程可以接受CPU调度,但不一定正在占用CPU,和线程优先级、调度算法、系统负载有关

黄色:Waiting: 表示线程正在睡眠(java.lang.Thread.Sleep),或者在监视器上等待(java.lang.Object.wait),前者不会放弃占有的监视器

红色:Blocked: 表示线程被阻塞,正在积极尝试进入同步区

浅蓝色:Net

I/O:线程正在等待网络操作的完成,监听Socket或者读写Socket时产生此状态

Thread Monitor

显示线程的开始结束时间、父线程、状态等信息

Thread Dumps

获取线程快照,可以分析瞬时系统各线程的调用栈

5.6 Monitor Views-监视器视图

该视图用于锁状态检测,包含以下选项卡:

Current Locking  Graph

显示耗时最高的方法调用,显示消耗时间、平均消耗时间、调用次数等字段,以耗时方法为根,

Conection leacks

连接泄漏 ,连接完后没有关闭

Telemetries执行时间分布图

events

连接事件

Trackes

工具栏Start Tracking,可以追踪某些任务在不同线程之间的传递(调用点/执行点Call site/Execution site)

5.8 JavaEE 以及探针(JEE & Probes)

可以使用多种探针来检测不同的应用领域,包括:JDBC、JPA/Hibernate、JNDI、JMS、Servlet、RMI、Socket、WebServices、Files等。

六、性能测试分析

6.1 内存泄漏的现象

a. 在服务器中执行某些批量操作的时候,发现内存只升不降;就算gc后,内存也不能被完全释放;

b. 除非重启tomcat服务器,内存永远不会被释放,反复执行这些操作,会导致无可用内存,会导致进程被kill。

6.2 内存分析

系统的内存消耗过多往往有以下几种原因:

a、频繁创建Java对象,如:数据库查询时,没分页,导致查出表中所有记录;

b、存在大对象,如:读取文件时,不是边读边写而是先读到一个byte数组,这样如果读取的文件时50M则仅此一项操作就会占有JVM50M内存。

c、存在内存泄漏,导致已不被使用的对象不被GC回收,从而随着系统使用时间的增长,内存不断受到解压,最终OutOfMemory。

6.3 CPU 分析

6.4 线程分析

线程的运行情况可以直接反应出系统的瓶颈所在,对线程一般有以下三个关注点:

a、Web容器的线程最大数管理,Web容器允许开启的线程数与系统要求的最大并发数有一定的对应关系,通常是Web容器运行的线程数略大于最大并发数,以Tomcat为例,在{$tomcat}/conf/server.xml文件的Connector选项里配置maxThreads,它的默认值时150;

b、线程阻塞;

c、线程死锁。

d、亮蓝色表示线程在 Net I/O操作,线程在等待 JAVA库的网络操作完成。在线程监听 socket连接或者等待读写数据到 socket中时,会产生这种状态

6.5 database分析

主要看 Hot Spots显示耗时最高的方法调用,显示消耗时间、平均消耗时间、调用次数等字段,以耗时方法为根。