JProfiler(安装/内存/CPU/线程分析)
JProfiler:全能型性能分析工具
JProfiler 是商业级 Java 性能分析工具,提供 CPU、内存、线程、GC 等全方位的分析能力。相比 MAT 只分析堆转储,JProfiler 擅长实时 profiling 和方法级别的热点分析。
安装与激活
安装
bash
# 下载地址:https://www.ej-technologies.com/products/jprofiler/overview.html
# 支持 Windows、macOS、Linux
# macOS 安装
# 下载 .dmg 文件,双击安装
# 独立模式:解压后运行
tar -xzf jprofiler_linux_*.tar.gz
jprofiler/bin/jprofiler激活
bash
# 首次启动会要求输入 license
# Eval Mode:免费试用 15 天
# 商业 License:购买后获得 license key
# 学术 License:免费申请教育版集成到 IDE
JProfiler 提供主流 IDE 插件:
bash
# IntelliJ IDEA / WebStorm / Android Studio
# Settings → Plugins → 搜索 "JProfiler" → Install
# Eclipse
# Help → Eclipse Marketplace → 搜索 "JProfiler"快速连接
bash
# 方式一:本地进程
# 启动 JProfiler → Session → Quick Attach → 本地 JVM
# 方式二:远程 Attach
# 启动 JProfiler → Session → Quick Attach → 远程
# 远程 JVM 需要添加参数:
java -agentlib:jprofilerti \
-XX:+UseG1GC \
-jar myapp.jar
# 方式三:启动模式(最推荐)
java -agentpath:/path/to/libljprofiler.so \
-XX:+UseG1GC \
-jar myapp.jar界面概览
JProfiler 主界面:
顶部工具栏:
Session → 新建/打开/导入 session
View → 切换视图
Profiling → 开始/停止 profiling
Recordings → 录制记录管理
左侧「Session」面板:
当前连接的 JVM
已保存的 Session
右侧「Views」区域(主要工作区):
Telemetry → 遥测图表(CPU/内存/线程)
CPU Views → CPU 分析
Memory Views → 内存分析
Threads → 线程分析
Monitors & Locks → 锁与监视器分析
GC Roots → GC Root 浏览器Telemetry(遥测)
Telemetry 是 JProfiler 的仪表盘,提供实时的性能指标图表。
CPU 遥测
CPU 使用率图表:
蓝色 → 应用 CPU 使用率
绿色 → GC CPU 使用率
灰色 → 其他进程
图表下方:
当前 CPU % | 峰值 CPU %内存遥测
堆内存图表:
各区域用不同颜色显示:
Eden → 浅绿色
Survivor → 深绿色
Old Gen → 蓝色
Metaspace → 紫色
红色竖线 → GC 事件
图表下方:
已用堆 | 最大堆 | GC 次数线程遥测
线程数图表:
蓝色 → 活动线程数
绿色 → 守护线程数
图表下方:
活动线程 | 峰值线程 | 已启动总数CPU 分析(CPU Views)
CPU 分析是 JProfiler 最核心的功能,用于定位方法级别的性能瓶颈。
Recording Controls
控制栏:
[Start Recording] → 开始录制 CPU
[Stop Recording] → 停止录制
[Snapshot] → 保存快照
录制方式:
Sampling(采样)→ 周期性采样,侵入性低,数据量大
Instrumentation(插桩)→ 方法入口/出口插桩,精确但侵入性高Hot Spots(热点方法)
热点视图列出消耗时间最多的方法:
热点方法视图:
Method | Invocations | Own Time | Total Time
com.example.Service.query()| 12,345 | 1234ms | 2345ms
java.sql.Statement.execute()| 8,765 | 876ms | 1234ms
...
排序选项:
Own Time → 方法自身执行时间(不含调用)
Total Time → 方法执行总时间(含调用)
Invocations → 调用次数Call Tree(调用树)
调用树展示方法的调用层次:
调用树示例:
- Run
└─ com.example.Service.process()
├─ com.example.DAO.findUser() 234ms
│ └─ java.sql.Connection.prepareStatement() 123ms
├─ com.example.Cache.get() 456ms
└─ com.example.Service.calculate() 345ms
└─ java.math.BigInteger.modPow() 234msCall Graph(调用图)
调用图以图形化方式展示调用关系:
调用图:
方法节点 → 大小表示调用时间
箭头 → 调用方向
颜色 → 方法类型(自研/框架/JDK)JDBCTelemetry(SQL 分析)
JProfiler 自动监控 JDBC 调用:
JDBC 视图:
所有 SQL 调用列表:
Connection | SQL | Time | Rows
统计:
按连接分组
按 SQL 模板分组(去掉参数)
按执行时间排序
慢 SQL 高亮:
执行时间超过阈值的 SQL 标红内存分析(Memory Views)
堆遍历(Heap Walker)
JProfiler 的 Heap Walker 比 VisualVM 更强大:
Heap Walker 标签:
Classes → 按类统计
Allocations → 按方法统计分配
Objects → 按对象查看
References → 引用分析
OQL → 对象查询语言Classes 视图
类视图:
Class | Count | Shallow Heap | Retained Heap
java.lang.String | 45,678 | 2,345,678 | 15,678,901
char[] | 23,456 | 4,567,890 | 10,234,567
com.example.User | 1,234 | 456,789 | 2,345,678
操作:
按 Count/Heap 排序
右键 → Show in Objects View
右键 → Selected Classes → Allocation SequenceAllocations 视图
Allocation 视图显示对象的创建热点:
Allocation by Method:
方法名 | Instances | Shallow Heap
com.example.Service.createUser() | 12,345 | 4,567,890
com.example.Service.process() | 8,765 | 3,234,567
→ 可以看到对象在哪里被创建
→ 结合 CPU 分析,可以定位分配热点内存泄漏检测
JProfiler 提供内存泄漏检测:
Memory Inspector:
自动分析可疑的内存泄漏
列出:
1. 泄漏嫌疑人
2. 泄漏对象的历史增长曲线
3. GC Root 路径线程分析(Threads)
线程状态
线程视图:
Name | State | CPU Time | Waited | Category
http-nio-8080-exec-1| RUNNABLE | 123ms | 0ms | pool
pool-1-thread-1 | WAITING | 45ms | 2345ms | pool
main | RUNNABLE | 12ms | 0ms | system
状态过滤:
Show All / Runnable / Waiting / Blocked线程历史
线程历史显示线程数量和状态随时间的变化:
线程历史图表:
X 轴:时间
Y 轴:线程数量
颜色:不同状态的线程Thread Dumps
JProfiler 可以保存线程转储:
Thread Dump 内容:
所有线程的堆栈
线程状态
锁信息
阻塞分析Monitors & Locks(锁与监视器)
这是排查死锁和锁竞争的核心视图。
Monitor Usage
监视器使用图表:
红色竖线 → 阻塞事件
蓝色 → 持有锁时间
橙色 → 等待锁时间Current Locking Graph
当前锁的持有和等待关系:
锁定关系图:
线程节点 → 持有/等待的锁
锁节点 → 类型和持有者
红色 → 线程阻塞中
绿色 → 线程正常运行Hot Monitors
热点监视器:
热点监视器视图:
锁对象 | Blocked Time | Waits
com.example.Lock | 4567ms | 123
java.lang.Object | 1234ms | 45
→ 高 blocked time 说明这个锁竞争激烈Deadlock Overview
死锁概览:
死锁检测:
如果发现死锁,列出:
1. 涉及的线程
2. 循环等待的锁
3. 线程栈实战案例
场景:接口响应慢
bash
# 1. 启动 JProfiler,连接应用
# 2. 开始 CPU 录制
# CPU Views → Start Recording
# 3. 调用慢接口
curl http://localhost:8080/api/slow
# 4. 停止录制
# CPU Views → Stop Recording
# 5. 分析 Hot Spots
# 查看哪个方法耗时最多
# 查看调用树,找出调用链路
# 6. 结合 JDBC 视图
# 查看是否有慢 SQL
# SQL 执行时间分布
# 7. 定位问题
# 常见原因:
# - N+1 查询问题
# - 数据库连接池配置不当
# - 循环中创建对象
# - 不必要的同步场景:内存持续增长
bash
# 1. 开始内存录制
# Memory Views → Record Allocations
# 2. 运行应用一段时间
# 3. 触发 GC,查看堆
# Memory Views → Heap Walker
# 4. 查看 Classes
# 按 Retained Heap 排序
# 找出内存占用最大的类
# 5. 查看 Allocation
# Allocation by Method
# 找出创建对象最多的方法
# 6. 对比两个时间点的快照
# Session → Compare Snapshots
# 观察对象增长情况本节小结
JProfiler 核心功能速查:
| 功能 | 用途 | 入口视图 |
|---|---|---|
| Telemetry | 实时 CPU/内存/线程图表 | 顶部 Telemetry |
| Hot Spots | 方法级别的耗时热点 | CPU Views |
| Call Tree | 方法调用层次分析 | CPU Views |
| JDBC Telemetry | SQL 执行分析 | CPU Views |
| Heap Walker | 堆转储分析 | Memory Views |
| Allocations | 对象创建热点 | Memory Views |
| Threads | 线程状态和历史 | Threads |
| Monitors | 锁竞争与死锁 | Monitors & Locks |
JProfiler vs MAT:JProfiler 擅长实时 profiling 和方法分析,MAT 擅长堆转储的深度分析。两者配合使用效果最佳。
下一节,我们来看 JMC/JFR/火焰图。
