# 性能诊断 JProfiler 工具使用

性能诊断 JProfiler 工具使用

  • JProfiler是一个重量级的JVM监控工具,提供对JVM精确监控,其中堆遍历、CPU剖析、线程剖析看成定位当前系统瓶颈的得力工具。可以统计压测过程中JVM的监控数据,定位性能问题。

官网地址:Java Profiler - JProfiler (ej-technologies.com)

安装方法

介绍

  • JProfiler是一个专业的工具,用于分析正在运行的JVM内部发生的事情。您可以在 开发,用于质量保证,并在生产系统遇到问题时执行消防任务。

方法调用

  • CPU分析:可以用不同的方式度量和可视化方法调用。对方法调用的分析可以帮助您了解应用程序正在做什么,并找到改进其性能的方法。

对象内存分配

  • 分析堆上的对象的分配、引用链和垃圾收集属于“内存分析”的范畴。此功能使您能够修复内存泄漏,通常使用更少的内存并分配更少的临时对象。

线程和锁

  • 线程可以持有锁,例如通过在对象上同步。当多个线程合作时,可能会发生死锁,JProfiler可以为您可视化它们。此外,锁可以是争用的,这意味着线程必须等待才能获得锁。JProfiler提供了对线程及其各种锁定情况的洞察。

高级子系统

  • 许多性能问题发生在更高的语义级别上。例如,对于JDBC调用,您可能希望找出哪个SQL语句是最慢的。对于这样的子系统,JProfiler提供了将特定的有效负载附加到调用树的“探测”。

Jprofiler 设置

数据采集模式

JProfier 提供两种数据采集模式 SamplingInstrumentation

  • Sampling - 适合于不要求数据完全精确的场景。优点是对系统性能的影响较小,缺点是某些特性不支持(如方法级别的统计信息)。
  • Instrumentation - 完整功能模式,统计信息也是精确的。缺点是如果需要分析的类比较多,对应用性能影响较大。为了降低影响,往往需要和 Filter 一起使用。

快照

生成堆快照

  • 在拍摄堆快照会产生过多开销或消耗过多内存的情况下,您可以 使用 JVM 作为内置功能提供的 HPROF 堆快照。 由于此操作不需要分析代理,因此这对于分析内存问题很有趣 在生产环境中运行的 JVM 中。

使用 JProfiler,有三种方法可以获取此类快照:

  • 对于实时会话,JProfiler GUI 在主菜单中提供了一个操作来触发 HPROF 堆转储。
    在这里插入图片描述

  • JProfiler 有一个特殊的“内存不足异常”触发器,用于在抛出 时保存 HPROF 快照。这对应于虚拟机参数

    -XX:+HeapDumpOnOutOfMemoryError
    

    HotSpot JVM 支持。

    • Dump文件 是在OOM内存溢出的时候,自动Dump文件转存快照的,配置JVM参数 ,就能够在发生Out of Memory错误的时候,就是把当前堆栈信息转存为快照Dump文件
      在这里插入图片描述
  • JDK 中的 jmap 可执行文件可用于从正在运行的 JVM 中提取 HPROF 堆转储。

    JProfiler 包含比 jmap 更通用的命令行工具。它 允许您选择一个进程,可以连接到在 Windows 上作为服务运行的进程,没有问题 混合了 32 位/64JVM 和自动编号的 HPROF 快照文件。使用选项执行它以获取更多信息。jpdump help

JDK 飞行记录器快照

  • JDK 包括 JDK 飞行记录器 (JFR) 机制,用于捕获有关方法的事件 执行、对象分配和 JVM 的其他重要子系统,并将它们保存到快照中。 生产环境可以选择连续使用此技术,以最大程度地减少开销并提供数据 故障 排除。可以使用以“JFR”开头的命令在JDK中记录和保存JFR快照。

  • 使用JProfiler,您可以打开JDK飞行记录器快照来分析记录的数据。打开 JFR 时 快照,只有一小部分 JProfiler 的视图将显示在对应于 JFR 记录中可用的数据类型。

Jprofiler分析Dump文件例子

分析大对象来源
  • 预估对象内存大小

  • calculate estimated retained size 预估内存对象使用大小
    在这里插入图片描述

  • 按照Size排序,可以看到TableClazzDO占用很多内存
    在这里插入图片描述

Incomming References 找引用当前对象的对象
  • 首先 选中对象,点击右键,Use select Objects;选择 incoming references 找到对象引用的地方
    在这里插入图片描述
  • 逐个查找
    在这里插入图片描述
  • 查看有问题的代码是下面写的这个测试代码
@Override
public void outOfMemory() {
    List<TableClazzDO> userList = new ArrayList();
    while (true) {
        List<TableClazzDO> tableClazzDOS = tableClazzDOMapper.selectByExample(new TableClazzDOExample());
        userList.addAll(tableClazzDOS);
    }
}
profile 大对象寻找法
使用Biggest Objects
  • 点开大对象进行分析, 同样的 Used Selected Objects
    在这里插入图片描述

  • 点击Incomming References 查找对象引用信息

  • 和上面一样点看逐个查找

Outgoing References 找该对象引用的所有对象
  • 同样的 Used Selected Objects

  • 后选择 Outgoing References 出引用信息

  • 然后点开分析该对象到底引用了哪些对象,可以看到具体的对象信息

用Graph 查找对象源
  • 先查找 Incomming References 找到对象被谁引用
  • 找到想要追查的对象后, 选择User Selected Objects
  • 后点击 Show In Graph 定位线程及Class信息
  • 然后根据 数据源Heap Walker 定位到问题的Class类信息及具体的行信息
    在这里插入图片描述

遥测

  • 监视一段时间内的标量测量值,例如使用的堆大小
    在这里插入图片描述
    完整视图显示具有当前值的图例,并且可能具有比概览中可见的选项更多的选项。 例如,“内存”遥测允许选择单个内存池。
    在这里插入图片描述

Cpu分析

  • JProfiler测量方法调用的执行时间及其调用堆栈时,我们称之为 CPU 分析。这些数据以多种方式呈现。取决于您尝试的问题 解决,一个或另一个演示文稿将最有帮助。默认情况下不记录 CPU 数据, 须打开CPU录制才能捕获用例。

调用树

  • 直观地 掌握繁忙的JVM中的方法调用次数
  • 可以知道方法调用相对于整个活动中的重要性 某个时间段
    在这里插入图片描述

线程状态

  • 在调用树的顶部有几个视图参数,用于更改所显示的类型和范围 分析数据。默认情况下,所有线程都是累积的。JProfiler 基于每个线程维护 CPU 数据,并且 您可以显示单个线程或线程组。

火焰图

  • 查看调用树的另一种方法是作为火焰图。您可以显示整个调用树或其中的一部分 作为火焰图,通过调用关联的调用树分析
    在这里插入图片描述

内存信息跟踪

  • 选择Telemetries-Memory即可查看内存整体占用情况。
    在这里插入图片描述

  • 选择Live memory-All objects可查看当前时刻内存对象统计信息。
    在这里插入图片描述

  • 点击Mark Current可以创建当前时刻内存对象基线,且可以查看两次Mark期间对象的变化情况。首次mark
    在这里插入图片描述

  • 第二次mark
    在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值