Skip to content

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()     234ms

Call 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 Sequence

Allocations 视图

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 TelemetrySQL 执行分析CPU Views
Heap Walker堆转储分析Memory Views
Allocations对象创建热点Memory Views
Threads线程状态和历史Threads
Monitors锁竞争与死锁Monitors & Locks

JProfiler vs MAT:JProfiler 擅长实时 profiling 和方法分析,MAT 擅长堆转储的深度分析。两者配合使用效果最佳。

下一节,我们来看 JMC/JFR/火焰图

基于 VitePress 构建