JProfiler性能分析工具详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JProfiler性能分析工具详解相关的知识,希望对你有一定的参考价值。
参考技术A JProfiler 是一个商业授权的 Java剖析工具,用于分析Java EE和Java SE应用程序.JDK 本身定义了目标明确并功能完善的JNI( Java Native Interface ) 与虚拟机直接进行交互,这些 API 能很方便的进行扩展,从而满足开发者各式的需求.
JVMTI( JVM Tool Interface) ,是JAVA虚拟机提供的本地接口,它是实现调度器以及其它Java运行测试与分析 工具 的基础.
并不一定在所有的JDK提供商都有实现,但在主流的Oracle JDK、Open JDK上都有其实现.
1.用户在JProfiler GUI中下达监控命令( 对应用户的一个点击 ).
2.JProfiler GUI通过自身Socket的8849端口向位于JVM的JProfiler Agent发送监控指令.
3.JProfiler Agent收到指令后向JVMTI注册事件或执行相关的命令.
4.JVMTI根据事件和命令的类型返回相对应的数据( 线程状态、对象实例、CPU负荷、GC状态信息等)
5.JProfiler Agent从JVMTI中得到相应数据后将对其进行计算,最终通过Socket传输给JProfiler GUI中进行展示.
https://www.ej-technologies.com/download/jprofiler/files
激活码: L-Larry_Lau@163.com #23874-hrwpdp1sh1wrn#0620
***** Linux操作系统无须激活
Select from all local JVMs模式:将扫描本地所有正在运行的JVM实例
Attach to profiled JVM模式:选择本地或远程正在运行的JVM实例,远程被监控的机器一定要预先安装JProfiler.
***** 需指定远程 服务器的JProfiler的通讯端口
步骤一:Session-->Integration Wizards-->New Server Integration
步骤二:选择应用服务器的类型以及版本号
步骤三:选择与本地或远程服务器的服务进行集成
***** 本文将使用远程服务器模式.
***** 若 选择与远程服务器的服务进行集成则需要选择远程服务器的操作系统类型.
步骤四:选择服务器使用的JVM供应商以及版本号
步骤五:选择JProfiler的启动模式
JVM将等待JProfiler Agent接收到JProfiler GUI发送的配置信息后再进行启动( 即Lauch Type连接模式 ,启动一个新的JVM实例)
立即启动JVM,稍后再与JProfiler GUI进行连接并向JProfiler Agent发送配置信息( 数据的采集方式、过滤器、触发器等信息 )
***** 若使用此模式则需要让JVM在启动时自动加载JProfiler Agent,因此需要在startup.bat/startup.sh文件中添加命令
startup.bat:set CATALINA_OPTS=-agentpath:JProfiler安装目录\bin\windows-x64\jprofilerti.dll=port=8849,nowait %CATALINA_OPTS%
startup.sh:CATALINA_OPTS=-agentpath:/JProfiler安装目录/bin/linux-x64/libjprofilerti.so=port=8849,nowait $CATALINA_OPTS
export CATALINA_OPTS
离线分析,JProfiler GUI无法与JProfiler Agent进行连接,因此需要将数据的采集方式、过滤器、触发器等信息打包成config.xml配置文件,在启动该JVM实例时加载JProfiler Agent以及配置文件,使用此模式需要配合triggers触发器使用,当发生指定的事件后触发指定的操作.
***** 若使用此模式则需要让JVM在启动时自动加载JProfiler Agent和context.xml配置文件,因此需要在startup.bat/startup.sh文件中添加命令
startup.bat:set CATALINA_OPTS=-agentpath:JProfiler安装目录\bin\windows-x64\jprofilerti.dll=port=8849,nowait,config=C:\Users用户名.jprofiler9\config.xml %CATALINA_OPTS%
startup.sh:CATALINA_OPTS=-agentpath:/JProfiler安装目录/bin/linux-x64/libjprofilerti.so=port=8849,config=预定义目录\config.xml $CATALINA_OPTS
export CATALINA_OPTS
步骤六:填写远程服务器的IP地址
步骤七:输入远程服务器中JProfiler的安装目录( 供JProfiler生成脚本时使用 )
步骤八:选择应用服务器的启动脚本,JProfiler会根据选择的启动脚本文件生成一份适用于JProfiler特定启动模式的脚本文件.
***** 最终在本地生成startup_jprofiler.sh文件,需将此文件复制到远程服务器中应用服务器的bin目录并对文件赋予执行的权限,在服务器中直接通过JProfiler提供的startup_jprofiler.sh文件来启动服务.
***** 若使用离线启动模式则还需要将JProfiler生成的context.xml配置文件复制到远程服务器中,然后修改startup_jprofiler.sh文件中JVM加载context.xml文件的路径.
步骤九:设置JProfiler GUI通讯的端口
步骤十:检查配置项
步骤十一:选择数据的采集方式
JProfiler将对需要分析的class字节码文件中写入自己的bytecode, 对于正在运行的JVM实例选择此模式将会重新加载字节码文件到JVM的运行时数据区域结构中 .
***** 这是JProfiler全功能模式,在此设置中,调用堆栈信息是准确的,但是CPU开销可能很高( 取决于Filter的控制 ),若要分析的类较多,则对应用的性能产生影响,因此使用此模式一般配合Filter使用,只对特定的类或包进行分析.
此模式对CPU的开销非常低,但不支持某些功能( 方法的执行次数、执行时间等 ), 这种模式在连接正在运行的JVM实例时更为安全.
步骤十二:选择配置Filter和Trigger
配置Filter( 适用于Instrumentation数据采集模式 )
配置Trigger( 多用在离线的启动模式 )
1.选择触发器的类型
2.选择触发的动作
步骤十三:完成配置,连接JProfiler Agent,对程序进行监控.
***** 每个Session表示一次会话,Session可以通过人工创建 ( New Session ) 或者与服务应用进行集成来产生( Integration Wizards ).
***** 支持将当前JVM实例的运行状态保存为快照( Save Snapshot )并提供快照与快照之间的对比功能.
Telemetries视图:包含JMM内存的使用情况( 全局堆与非堆、局部伊甸园区、幸存者区、老年代)、GC线程的活动情况( 发生GC的时间,是属于Minor GC还是Full GC )、当前JVM实例的线程概况、CPU的负载等信息.
Live Memory视图:展示当前堆中实例的个数、方法的调用链等信息.
方法调用链信息:
Heap Walker视图:用于堆的快照分析,可以选择在Live Memory中记录的对象或者当前运行状态时堆的对象也可以直接在对象视图右键对象Show Selection In Heap Walker.
CPU Views视图:可以按运行顺序逐级查看当前程序运行时的耗时、在一定时间内统计方法的执行效率.
程序运行耗时:
一定时间内统计方法的执行效率( 单位:微秒 ):
Total Time:执行总时长.
Inv:执行的次数.
Avg Time:方法平均执行时长.
Median Time:第中间次数的执行时长.
Min Time:最短执行时长.
Max Time:最大执行时长.
[转帖]JAVA性能监控工具之Jprofiler
JAVA性能监控工具之Jprofiler
https://www.jianshu.com/p/1287704d1803
一、代码质量保障
当前当码质量、安全、测试覆盖范围都有对应的工具及成熟的度量指标,但性能一直处于空缺阶段,建议将性能前置纳入开发 or 测试阶段可以解决大部分(预测在30~50%)性能问题(可以先实践在总结)。
二、当前性能测试存在的一些问题
性能测试工具选型、及jvm调优、方案设计非重要,否则会做很多无用功。
三、Java代码监控及分析工具
3.1 jporfiler
工具描述:Jprofiler 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内存溢出性能分析工具
优点:
缺点:功能单一
四、安装
下载地址:https://www.ej-technologies.com/download/jprofiler/version_92
五、视图使用说明
5.1 Telemetries 遥测视图
5.2 Live Memory-内存视图
该视图专注于对象的内存分配情况,包含以下选项卡
All Objects
显示堆中实时的对象情况:显示某种类型(聚合级别可以是类、包等)对象的数量(Instance Count)、浅尺寸(Shallow size)关于浅尺寸的计算:
普通对象大小的计算不包括引用、类变量,由变量本身地址、基本类型的变量占用的内存等组成
数组整体计算,不分为单个元素计算大小/数量
注意,有些对象虽然没有引用,但是可能没被GC回收,可以手工Run GC
右击某一类型,可以转到Class Tracker或者Heaper Walker视图
Recorded Objects
显示已经进行记录的对象。与All Objects相比,可以查看对象分配调用树(Allocation Call
Tree)、分配热点(Allocation Hot Sports)点击工具栏:Start Memory,可以录制对象分配
Allocation Call Tree
显示选中的、已录制对象类型的分配调用数,分析调用栈的哪些栈帧比较消耗资源。从线程执行开始处,一直追溯到对象被创建的地方,显示对象占用内存的大小。
Allocation Hot Sports
显示选中的、已录制对象类型的分配热点:以创建对象的方法为根显示调用树,一般看 hot sports
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
显示耗时最高的方法调用,显示消耗时间、平均消耗时间、调用次数等字段,以耗时方法为根,可以追溯到线程启动处Filtered Classes设置:选择被过滤类占用时间,可以单独列出,或者算在调用它的元素上(main、线程run不能过滤)每个方法可能被多个调用栈调用,百分比显示不同调用栈对此方法的固有时间的“贡献”不显示Total time,只显示Inherent Time
Call Graph
显示方法调用的序列,包括某个方法的调用与被调用情况
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
当前锁状态图,显示监视器、以及在监视器上等待的线程。
黑色箭头表示当前拥有此监视器的线程
红色虚线表示被阻塞的线程(积极尝试获得锁)
黄色箭头表示在监视器上等待的线程(java.lang.Object.wait)
Current Monitors
显示当前活动的监视器,包括监视器状态、监视器类、等待线程、拥有者线程等信息
Locking History Graph
可以录制监视器锁定的历史
Monitor History
可以显示所有监视器的历史
Monitor Usage Stat
以监视器、线程等方式分组,显示监视器的使用统计,包括阻塞次数、阻塞持续时间、等待次数、等待持续时间等
5.7 Database-数据库视图
该视图用于查看jdbc连接及执行情况,包括以下选项
Time lineIdle
颜色:黄色,表示:空闲的
Statement execution:颜色:绿色,表示:语句执行
Perpared Statement execution:颜色:蓝色,表示:准备执行。
Batch execution:颜色:紫色,表示批量执行。
Connections
连接数,连接id,开始时间,结束时间,事件个数,事件执行持续时间
Call Tree
显示自顶而下的调用堆栈的树,树的根是线程开始处,树的分叉表示的不同的调用路径。暗红色显示当前节点及其子节点消耗的时间、高亮红色显示本级节点sql执行消耗的时间。
界面右上角的Thread Status用于选择参与分析的线程状态,通常选择Runnable来分析性能问题,有时可以结合Net I/O、Blocked。
Hot Spot
显示耗时最高的方法调用,显示消耗时间、平均消耗时间、调用次数等字段,以耗时方法为根,
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 分析
a、CPU消耗的分布及时间(cpu时间或者运行时间); 方法的执行图; 方法的执行统计(最大,最小,平均运行时间等)
b、主要看hot spots看那个资源耗时时间,平均时长,及访问次数。
c、请求响应时时间越长越消耗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显示耗时最高的方法调用,显示消耗时间、平均消耗时间、调用次数等字段,以耗时方法为根。
a、sql执行较慢的需要优化sql。
b、执行次数较多也需要处理。
c、查看db最大线程数是多少,是否满足当前业务,如果不满足需要调整。
d. 在性能执行过程中若接口请求较快时需要添加一定的think time,这个根据项目而定,一般在100ms左右。
以上是关于JProfiler性能分析工具详解的主要内容,如果未能解决你的问题,请参考以下文章