目录
一、概述
在运行Java的时候有时候想测试运行时占用内存情况,这时候就需要使用测试工具查看了。在eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试,而在IDEA中也有这么一个插件,就是JProfiler。JProfiler 是由 ej-technologies 公司开发的一款 Java 应用性能诊断工具,功能强大,但是收费。
特点:
- 使用方便、界面操作友好(简单且强大);
- 对被分析的应用影响小(提供模板);
- CPU,Thread,Memory分析功能尤其强大;
- 支持对jdbc,noSql,jsp,servlet,socket等进行分析;
- 支持多种模式(离线,在线)的分析;
- 支持监控本地、远程的JVM;
- 跨平台,拥有多种操作系统的安装版本;
主要功能:
- 1-方法调用:对方法调用的分析可以帮助您了解应用程序正在做什么,并找到提高其性能的方法;
- 2-内存分配:通过分析堆上对象、引用链和垃圾收集能帮您修复内存泄露问题,优化内存使用;
- 3-线程和锁:JProfiler提供多种针对线程和锁的分析视图助您发现多线程问题;
- 4-高级子系统:许多性能问题都发生在更高的语义级别上。例如,对于JDBC调用,您可能希望找出执行最慢的SQL语句。JProfiler支持对这些子系统进行集成分析;
官网地址:Java Profiler - JProfiler
二、两种数据采集方式
- Instrumentation(重构模式)
这是JProfiler全功能模式。在class加载之前,JProfier把相关功能代码写入到需要分析的class的bytecode中,对正在运行的jvm有一定影响。
- 优点:功能强大,在此设置中,调用堆栈信息是准确的。
- 缺点:若要分析的class较多,则对应用的性能影响较大,CPU开销可能很高(取决于Filter的控制)。因此使用此模式一般配合Filter使用,只对特定的类或包进行分析。
- Sampling(样本采集)
类似于样本统计,每隔一定时间(5ms)将每个线程栈中方法栈中的信息统计出来。
- 优点:对CPU的开销非常低,对应用影响小(即使你不配置任何Filter);
- 缺点:一些数据/特性不能提供(例如:方法的调用次数、执行时间);
注:JProfiler本身没有指出数据的采集类型,这里的采集类型是针对方法调用的采集类型。因为JProfiler的绝大多数核心功能都依赖方法调用采集的数据,所以可以直接认为是JProfiler的数据采集类型。
如下图,当我们打开JProfiler时,会弹出选择哪一种数据采集方式:
下图是样本抽样采集方式:
三、VM遥感监测视图中相关监测数据
【a】概览:展示内存、GC、类、线程、CPU等使用情况
【b】内存:可以选择不同内存区域查看其使用情况,使用不同颜色区分空闲内存和已使用内存
【c】GC:显示垃圾回收活动,包括对象释放的一条线和对象移动的一条线
【d】类信息:显示 JVM调用的类的总,分为过滤类和非过滤类
【e】线程:显示 JVM中活着的线程总数,分为活动的线程和不活动的线程
【f】CPU:展示CPU利用率变化情况
四、内存视图(Live Memory)的分析
JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
(一)、所有对象 All Objects:显示所有加载的类的列表和在堆上分配的实例数。只有Java 1.5 (JVMTI)才会显示此视图。要查看特定时间段对象的分配,并记录分配的调用堆栈,请使用“记录的对象视图”。
有一个集合体等级选择器,你可以在以下几种类型中切换:
- 类(classes):每一行显示一个单独的类,这是默认的集合体类型
- 包(packages):每一行显示一个单独的包,子包不包含在内。在这个集合体等级内,表是树形的。你可以点击树节点,查看其包含的类
- J2EE组件( J2EE components):每一行是一个 J2EE组件。此模式类似类模式中的过滤器,能够让你快速检查应用中加载的 J2EE组件。
(二)、记录对象 Record Objects:查看特定时间段对象的分配,并记录分配的调用堆栈。
记录的对象视图可以根据对象的活动状态进行过滤:
- 活动对象(Live objects) 只显示当前在内存中的对象;
- 垃圾回收对象(Garbage collected objects) 被显示被回收的对象;
- 活动的和垃圾回收对象(Live and garbage collected objects) 显示所有被创建的对象;
(三)、分配访问树 Allocation Call Tree:显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。
(四)、分配热点 Allocation Hot Spots:显示一个列表,包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值,对于每个热点都可以显示它的跟踪记录树。
(五)、类追踪器 Class Tracker:类跟踪视图可以包含任意数量的图表,显示选定的类和包的实例与时间。
五、Heap Walker功能说明
这个视图主要追踪应用程序运行过程中堆内存的使用情况,如下图:
【a】类(Classes):显示所有类和它们的实例
【b】索引(References):为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能
六、CPU视图功能说明
JProfiler 提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。
(一)、访问树 Call Tree:显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。JDBC,JMS和JNDI服务请求都被注释在请求树中。请求树可以根据Servlet和JSP对URL的不同需要进行拆分。
(二)、热点 Hot Spots:显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBC,JMS和JNDI服务请求以及按照URL请求来进行计算。
(三)、 访问图 Call Graph:显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。
(四)、 方法统计 Method Statistis:显示一段时间内记录的方法的调用时间细节。
七、Threads视图功能说明
JProfiler通过对线程历史的监控判断其运行状态,并监控是否有线程阻塞产生,还能将一个线程所管理的方法以树状形式呈现,方便对线程进行剖析。
(一)、线程历史 Thread History:显示一个与线程活动和线程状态在一起的活动时间表。按照线程开始的顺序显示 JVM中所有线程状态的详细历史信息在视图左手点,线程的名字固定显示,其它部分是滚动度量工具,在水平轴上显示时间。时间轴的开始时间与 JVM的第一个线程的时间保持一致。每个活动的线程用带颜色的线标明,从线程开始到线程结束。
- 颜色标识线程的状态:
- 绿色:绿色表明线程正在运行并能接收 CPU时间。不表明线程正在消耗 CPU时间,只表明线程准备运行并且没有阻塞或睡眠。线程被分配了多少 CPU时间,依赖于不同的其它因素,如总的系统负载,线程优先级和调度的运算法则
- 橙色:橙色表示线程在等待。线程正在睡眠并等待计时器或其它线程唤醒
- 红色:红色表示线程阻塞。线程尝试进入同步代码区或由其它线程控制的同步方法
- 蓝色:亮蓝色表示线程在 Net I/O操作,线程在等待 JAVA库的网络操作完成。在线程监听 socket连接或者等待读写数据到 socket中时,会产生这种状态。
(二)、 线程监控 Thread Monitor:显示一个列表,包括所有的活动线程以及它们目前的活动状况。
显示的五列:
- Name:显示线程名称,如果线程没有被特别命名,则使用 JVM提供的名称。想让此视图更加有用,最好将你自己创建的线程使用 setName() 进行命名。
- Group:显示与此线程相关的线程组的名称
- Start time:示线程开始的时间,时间是根据 JVM中第一个线程创建的时间还计算的。
- Creating thread:显示线程的名字和创建此线程的线程组。
- Status:显示线程的状态,相当于线程历史视图中的状态报告
(三)、线程转储 Thread Dumps:显示所有线程的堆栈跟踪。
线程分析主要关心三个方面:
1.web容器的线程最大数。比如:Tomcat的线程容量应该略大于最大并发数;
2.线程阻塞;
3.线程死锁;