JProfiler基础

介绍

技术 特性 适用场景 说明
JProfiler 方法调用 - 对方法调用的分析可以帮助您了解应用程序正在做什么,并找到提高其性能的方法。
内存分配 - 通过分析堆上对象、引用链和垃圾收集能帮您修复内存泄漏问题,优化内存使用。
线程和锁 - JProfiler 提供多种针对线程和锁的分析视图助您发现多线程问题。
高级子系统 - 许多性能问题都发生在更高的语义级别上。例如,对于JDBC调用,您可能希望找出执行最慢的 SQL 语句。JProfiler 支持对这些子系统进行集成分析。
Java剖析 - 官网JProfiler 是由 ej-technologies 公司开发的一款 Java 应用性能诊断工具。
jProfile架构图.jpg
jProfile架构图.jpg

基本概念

基本概念 说明
JProfiler agent JProfiler agent 是一个本地库,它可以在 JVM 启动时通过参数-agentpath:
进行加载或者在程序运行时通过 JVM Attach 机制进行加载。Agent 被成功加载后,会设置 JVMTI 环境,监听虚拟机产生的事件,如类加载、线程创建等。例如,当它监听到类加载事件后,会给这些类注入用于执行度量操作的字节码。
JProfiler UI JProfiler UI 是一个可独立部署的组件,它通过 socket 和 agent 建立连接。这意味着不论目标 JVM 运行在本地还是远端,JProfiler UI 和 agent 间的通信机制都是一样的。
JProfiler UI 的主要功能是展示通过 agent 采集上来的分析数据,此外还可以通过它控制 agent 的采集行为,将快照保存至磁盘,展示保存的快照。
命令行工具 JProfiler 提供了一系列命令行工具以实现不同的功能。
jpcontroller - 用于控制 agent 的采集行为。它通过 agent 注册的 JProfiler MBean 向 agent 传递命令。
jpenable - 用于将 agent 加载到一个正在运行的 JVM 上
jpdump - 用于获取正在运行的 JVM 的堆快照。
jpexport & jpcompare - 用于从保存的快照中提取数据并创建 HTML 报告。
数据采集模式 JProfier 提供两种数据采集模式 Sampling 和 Instrumentation。
Sampling - 适合于不要求数据完全精确的场景。优点是对系统性能的影响较小,缺点是某些特性不支持(如方法级别的统计信息)。
Instrumentation - 完整功能模式,统计信息也是精确的。缺点是如果需要分析的类比较多,对应用性能影响较大。为了降低影响,往往需要和 Filter 一起使用。
应用启动模式 通过为 JProfiler agent 指定不同的参数可以控制应用的启动模式。
等待模式 - 只有在 Jprofiler GUI 和 agent 建立连接并完成分析配置设置后,应用才会真正启动。在这种模式下,您能够获取应用启动时期的分析数据。对应的命令为-agentpath:=port=8849。
立即启动模式 - 应用会立即启动,Jprofiler GUI 会在需要时和 agent 建立连接并设置分析配置。这种模式相对灵活,但会丢失应用启动初期的分析数据。对应的命令为-agentpath:=port=8849,nowait。
离线模式 - 通过触发器记录数据、保存快照供事后分析。对应的命令为-agentpath:=offline,id=xxx,config=/config.xml。
Overview 在概览页可以清晰的看到内存使用量、垃圾收集活动、类加载数量、线程个数和状态、CPU 使用率等指标随时间变化的趋势。
CPU views CPU views 下的各个子视图展示了应用中各方法的执行次数、执行时间、调用关系等信息,能帮我们定位对应用性能影响最大的方法。
Call Tree Call tree 通过树形图清晰地展现了方法间的层次调用关系。同时,JProfiler 将子方法按照它们的执行总时间由大到小排序,这能让您快速定位关键方法。
Hot Spots 如果您的应用方法很多,且很多子方法的执行时间比较接近,使用 hot spots 视图往往能助您更快地定位问题。该视图能根据方法的单独执行时间、总执行时间、平均执行时间、调用次数等属性对它们排序。其中,单独执行时间等于该方法的总执行时间减去所有子方法的总执行时间。
Call Graph 找到了关键方法后,call graph 视图能为您呈现与该方法直接关联的所有方法。这有助于我们对症下药,制定合适的性能优化策略。
Live memory Live memory 下的各个子视图能让您掌握内存的具体分配和使用情况,助您判断是否存在内存泄漏问题。
All Objects All Objects 视图展示了当前堆中各种对象的数量和总大小。由图可知,程序在运行过程中构造出了大量 LogContent 对象。
Allocation Call Tree Allocation Call Tree 以树形图的形式展示了各方法分配的内存大小。
Allocation Hot Spots 如果方法比较多,您还可以通过 Allocation Hot Spots 视图快速找出分配对象最多的方法。
Thread History 线程历史记录视图直观地展示了各线程在不同时间点的状态。
Overhead Hot Spots Detected 当程序运行结束后,JProfiler 会弹出一个对话框展示那些频繁被调用,但执行时间又很短的方法。在下次诊断时,您可以让 JProfiler agent 在分析过程中忽略掉这些方法以减轻对应用性能的影响。

功能

视图 功能 说明
memory views(内存视图) 所有对象 All Objects 显示类或在状况统计和尺码信息堆上所有对象的包。你可以标记当前值并显示差异值。
memory views(内存视图) 记录对象 Record Objects 显示类或所有已记录对象的包。你可以标记出当前值并且显示差异值。
memory views(内存视图) 分配访问树 Allocation Call Tree 显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。
memory views(内存视图) 分配热点 Allocation Hot Spots 显示一个列表,包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值。对于每个热点都可以显示它的跟踪记录树。
memory views(内存视图) 类追踪器 Class Tracker 类跟踪视图可以包含任意数量的图表,显示选定的类和包的实例与时间。
heap walker(堆遍历) 类 Classes 显示所有类和它们的实例,可以右击具体的类"Used Selected Instance"实现进一步跟踪。
heap walker(堆遍历) 分配 Allocations 为所有记录对象显示分配树和分配热点。
heap walker(堆遍历) 索引 References 为单个对象和“显示到垃圾回收根目录的路径”提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。
heap walker(堆遍历) 时间 Time 显示一个对已记录对象的解决时间的柱状图。
heap walker(堆遍历) 检查 Inspections 显示了一个数量的操作,将分析当前对象集在某种条件下的子集,实质是一个筛选的过程。
heap walker(堆遍历) 图表 Graph 你需要在references视图和biggest视图手动添加对象到图表,它可以显示对象的传入和传出引用,能方便的找到垃圾收集器根源。
Ps:在工具栏点击"Go To Start"可以使堆内存重新计数,也就是回到初始状态。
cpu views(cpu视图) 访问树 Call Tree 显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。JDBC,JMS和JNDI服务请求都被注释在请求树中。请求树可以根据Servlet和JSP对URL的不同需要进行拆分。
cpu views(cpu视图) 热点 Hot Spots 显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBC,JMS和JNDI服务请求以及按照URL请求来进行计算。
cpu views(cpu视图) 访问图 Call Graph 显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。
cpu views(cpu视图) 方法统计 Method Statistis 显示一段时间内记录的方法的调用时间细节。
thread views(线程视图) 线程历史 Thread History 显示一个与线程活动和线程状态在一起的活动时间表。
thread views(线程视图) 线程监控 Thread Monitor 显示一个列表,包括所有的活动线程以及它们目前的活动状况。
thread views(线程视图) 线程转储 Thread Dumps 显示所有线程的堆栈跟踪。
monitor views(监控器视图) 当前锁定图表 Current Locking Graph 显示JVM中的当前锁定情况。
monitor views(监控器视图) 当前监视器 Current Monitors 显示当前正在等待或阻塞中的线程操作。
monitor views(监控器视图) 锁定历史图表 Locking History Graph 显示记录在JVM中的锁定历史。
monitor views(监控器视图) 监控器历史 Monitor History 显示等待或者阻塞的历史。
monitor views(监控器视图) 监控器使用统计 Monitor Usage Statistics 计算统计监控器监控的数据。
VM telemetry views(vm遥感勘测技术视图) 内存 Memory 显示堆栈的使用状况和堆栈尺寸大小活动时间表。
VM telemetry views(vm遥感勘测技术视图) 记录的对象 Recorded Objects 显示一张关于活动对象与数组的图表的活动时间表。
VM telemetry views(vm遥感勘测技术视图) 记录的生产量 Recorded Throughput 显示一段时间累计的JVM生产和释放的活动时间表。
VM telemetry views(vm遥感勘测技术视图) 垃圾回收活动 GC Activity 显示一张关于垃圾回收活动的活动时间表。
VM telemetry views(vm遥感勘测技术视图) 类 Classes 显示一个与已装载类的图表的活动时间表。
VM telemetry views(vm遥感勘测技术视图) 线程 Threads 显示一个与动态线程图表的活动时间表。
VM telemetry views(vm遥感勘测技术视图) CPU负载 CPU Load 显示一段时间中CPU的负载图表。

安装

CentOS 中安装 JProfiler agent

1
2
3
4
5
6
7
# 下载
$ wget https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_linux_11_0_2.rpm

# 安装
$ yum -y localinstall jprofiler_linux_11_0_2.rpm

## 默认安装路径:/opt/jprofiler11

配置 jProfile

配置探针示例

1
-agentpath:/opt/jprofiler11/bin/linux-x64/libjprofilerti.so=port=8849,nowait

Tomcat 中配置 jProfile 探针

1
2
# tomcat/bin/catalina.sh 中 JAVA_OPTS之后增加配置
-agentpath:/opt/jprofiler11/bin/linux-x64/libjprofilerti.so=port=8849,nowait

连接到远程 jProfile

如下启动界面,【选择】“Profile an application server,locally or remotely” 1.png 【选择】 Web 容器的版本 2.png 【选择】远程机器的类型 3.png 【选择】JVM 的类型 4.png 【选择】JProfiler GUI 的启动时间 5.png 【填写】远程服务器的 IP 地址 6.png 【填写】远程机器 jProfile 的安装目录 7.png

8.png 【选择】Tomcat 启动脚本目录 9.png 【填写】jProfile 的端口 10.png 11.png 12.png 13.png 14.png 15.png

坚持原创技术分享,您的支持将鼓励我继续创作!
0%