JProfiler性能分析工具
1.简介
JProfiler是一个商业授权的Java剖析工具,用于分析Java EE和Java SE应用程序。
2.JVMTI
JDK本身定义了目标明确并功能完善的JNI(Java Native Interface)与虚拟机直接进行交互,这些 API 能很方便的进行扩展,从而满足开发者各种需求。
JVMTI(JVM Tool Interface) ,是JAVA虚拟机提供的本地接口,它是实现调度器以及其它Java运行测试与分析工具的基础。
*并不一定在所有的JDK提供商都有实现,但在主流的Oracle JDK、Open JDK上都有其实现。
*在开发的过程中一般是使用Agent的方式来使用JVMTI,通过调用JVMTI的函数,从JVM中得到当前的运行信息。
3.JProfiler内部模型

4.JProfiler数据采集的原理

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中进行展示。
5.JProfiler的使用
5.1 安装
https://www.ej-technologies.com/download/jprofiler/files
*Window操作系统请安装9.X版本,输入激活码对软件进行激活(激活码:L-Larry_Lau@163.com#23874-hrwpdp1sh1wrn#0620 )
*Linux操作系统无须激活
5.2 JProfiler与应用进行连接
1.与正在运行的JVM实例进行连接
Select from all local JVMs模式:将扫描本地所有正在运行的JVM实例

Attach to profiled JVM模式:选择本地或远程正在运行的JVM实例,远程被监控的机器一定要预先安装JProfiler。

*需指定远程服务器的JProfiler的通讯端口
2.启动一个新的JVM实例一并连接

*需要指定程序的启动类( 包含main方法的类 )
3.与Server进行集成( 需与服务捆绑 )
步骤一:Session-->Integration Wizards-->New Server Integration

步骤二:选择应用服务器的类型以及版本号

步骤三:选择与本地或远程服务器的服务进行集成

*本文将使用远程服务器模式.
*若选择与远程服务器的服务进行集成则需要选择远程服务器的操作系统类型.
步骤四:选择服务器使用的JVM供应商以及版本号

步骤五:选择JProfiler的启动模式

Wait for JProfiler GUI模式
JVM将等待JProfiler Agent接收到JProfiler GUI发送的配置信息后再进行启动(即Lauch Type连接模式,启动一个新的JVM实例)
Prepare for profling模式
立即启动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
Profile Offine模式
离线分析,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通讯的端口

步骤十:检查配置项

步骤十一:选择数据的采集方式

Instrumentation重构模式
JProfiler将对需要分析的class字节码文件中写入自己的bytecode,对于正在运行的JVM实例选择此模式将会重新加载字节码文件到JVM的运行时数据区域结构中.
*这是JProfiler全功能模式,在此设置中,调用堆栈信息是准确的,但是CPU开销可能很高( 取决于Filter的控制 ),若要分析的类较多,则对应用的性能产生影响,因此使用此模式一般配合Filter使用,只对特定的类或包进行分析.
Sampling抽样模式
此模式对CPU的开销非常低,但不支持某些功能( 方法的执行次数、执行时间等 ), 这种模式在连接正在运行的JVM实例时更为安全.
步骤十二:选择配置Filter和Trigger

配置Filter( 适用于Instrumentation数据采集模式 )

配置Trigger( 多用在离线的启动模式 )
1.选择触发器的类型

2.选择触发的动作

步骤十三:完成配置,连接JProfiler Agent,对程序进行监控.

*每个Session表示一次会话,Session可以通过人工创建 ( New Session ) 或者与服务应用进行集成来产生( Integration Wizards ).
*支持将当前JVM实例的运行状态保存为快照( Save Snapshot )并提供快照与快照之间的对比功能.
5.3 视图介绍
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:最大执行时长.
JProfiler性能分析工具的更多相关文章
- Java几款性能分析工具的对比
在给客户的应用程序维护的过程中,我注意到在高负载下的一些性能问题.理论上,增加对应用程序的负载会使性能等比率的下降.然而,我认为性能下降的比率远远高于负载的增加.我也发现,性能可以通过改变应用程序的逻 ...
- Java 性能分析工具 , 第 3 部分: Java Mission Control
引言 本文为 Java 性能分析工具系列文章第三篇,这里将介绍如何使用 Java 任务控制器 Java Mission Control 深入分析 Java 应用程序的性能,为程序开发人员在使用 Jav ...
- Java 性能分析工具 , 第 2 部分:Java 内置监控工具
引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...
- Java 性能分析工具 , 第 1 部分: 操作系统工具
引言 性能分析的前提是将应用程序内部的运行状况以及应用运行环境的状况以一种可视化的方式更加直接的展现出来,如何来达到这种可视化的展示呢?我们需要配合使用操作系统中集成的程序监控工具和 Java 中内置 ...
- 系统级性能分析工具perf的介绍与使用
测试环境:Ubuntu16.04(在VMWare虚拟机使用perf top存在无法显示问题) Kernel:3.13.0-32 系统级性能优化通常包括两个阶段:性能剖析(performance pro ...
- 性能分析工具-PerfView
Roslyn的PM(程序经理) Bill Chiles,Roslyn使用纯托管代码开发,但性能超过之前使用C++编写的原生实现,这有什么秘诀呢?他最近写了一篇文章叫做<Essential Per ...
- 11个Visual Studio代码性能分析工具
软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...
- Linux性能分析工具的安装和使用
转自:http://blog.chinaunix.net/uid-26488891-id-3118279.html Normal 0 7.8 磅 0 2 false false false EN-US ...
- php性能分析工具 - xhprof的安装使用
一.前言 有用的东西还是记录下来吧,也方便以后的查询:这次记录一下xhprof的安装使用: xhprof是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低, ...
随机推荐
- Ubuntukylin 14.04 系统语言改成中文[转]
1.在左侧点击"system setting" 2.按在图中方法设置 3.重启系统 参考地址:http://hi.baidu.com/thj2080/item/ae8e5dce ...
- Python基础——3特性
特性 切片 L=[0,1,2,3,4,5,6,7,8,9,10] L[:3]=[0,1,2] L[-2:]=[9,10] L[1:3]=[1,2] L[::3]=[0,3,6,9] L[:5:2]=[ ...
- fastjson List转JSONArray以及JSONArray转List
1.fastjson List转JSONArrayList<T> list = new ArrayList<T>();JSONArray array= JSONArray.p ...
- MATLAB accumarray
先看看subs和val的具体内容 subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2]; subs = 1 1 1 2 1 2 2 ...
- 基于element ui的级联选择器组件实现的分类后台接口
今天在做资产管理系统的时候遇到一个分类的级联选择器,前端是用的element的组件,需要后台提供接口支持. 这个组件需要传入的数据结构大概是这样的,详细的可参考官方案例: [{ value: ...
- 理解mysql执行多表联合查询
阅读目录 一:inner join(内连接) 二:left join(左连接) 三:right join(右连接) 四:cross join(交叉连接) 五:union操作 六:node+mysql ...
- cpu_ops、suspend_ops、arm_idle_driver以及machine_restart/machine_power_off到底层PSCI Firmware分析
在内核中针对的cpu的操作,比如arm_cpuidle_init.arm_cpuidle_suspend.boot_secondary.secondary_start_kernel.op_cpu_di ...
- DisplayAttribute没作用,why?
namespace WebBulletinBoard.DataAccess { using System; using System.ComponentModel.DataAnnotations; u ...
- String Successor zoj 3490
链接 [https://vjudge.net/contest/294259#problem/D] 题意 就是给你一个字符串,要进行n次操作 让你输出每次的字符串 操作规则: 1.如果有数字或者字母就忽 ...
- 接口请求,上传byte数组byte[]数据异常,负数变正数/负数变63
一.背景 最近项目中有个需求,就是需要把一个byte[]数组上传到服务端.但是我发现发送的byte数组和服务端接收的数组不一样,所有的正数在传递时正确,数组长度也没变化,但是负数变成了63或者负数全部 ...