背景

基于jprofiler12.0.4

性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益.Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注.可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等.想要定位这些问题,一款优秀的性能诊断工具必不可少.本文将介绍 Java 性能诊断过程中的常用工具,并重点介绍其中的优秀代表 JProfiler 的基本原理和最佳实践

其它工具

命令行工具

JDK 内置了许多命令行工具,它们可用来获取目标 JVM 不同方面、不同层次的信息.

  1. jinfo - 用于实时查看和调整目标 JVM 的各项参数.
  2. jstack - 用于获取目标 Java 进程内的线程堆栈信息,可用来检测死锁、定位死循环等.
  3. jmap - 用于获取目标 Java 进程的内存相关信息,包括 Java 堆各区域的使用情况、堆中对象的统计信息、类加载信息等.
  4. jstat - 一款轻量级多功能监控工具,可用于获取目标 Java 进程的类加载、JIT 编译、垃圾收集、内存使用等信息.
  5. jcmd - 相比 jstat 功能更为全面的工具,可用于获取目标 Java 进程的性能统计、JFR、内存使用、垃圾收集、线程堆栈、JVM 运行时间等信息.

阿里开源的arthas,是一款综合诊断的工具

图形化工具

ecliseMAT是专门的内存分析工具,主要用于查找内存是否泄露

JVisualvm 是 JDK 内置的可视化性能诊断工具,它通过 JMX、jstatd、Attach API 等方式获取目标 JVM 的分析数据,包括 CPU 使用率、内存使用量、线程堆栈信息等.此外,它还能直观地展示 Java 堆中各对象的数量和大小、各 Java 方法的调用次数和执行时间等.

分布式监控工具

skywalking之类的工具,微服务,云原生,监控分布式应用

jprofiler简述

JProfiler 是由 ej-technologies 公司开发的一款 Java 应用性能诊断工具

  1. 方法调用 - 对方法调用的分析可以帮助您了解应用程序正在做什么,并找到提高其性能的方法。
  2. 内存分配 - 通过分析堆上对象、引用链和垃圾收集能帮您修复内存泄漏问题,优化内存使用。
  3. 线程和锁 - JProfiler 提供多种针对线程和锁的分析视图助您发现多线程问题。
  4. 高级子系统 - 许多性能问题都发生在更高的语义级别上。例如,对于JDBC调用,找出执行最慢的 SQL 语句。JProfiler 支持对这些子系统进行集成分析。

jprofiler简介

核心组件

JProfiler 包含用于采集目标 JVM 分析数据的 JProfiler agent、用于可视化分析数据的 JProfiler UI、提供各种功能的命令行工具,它们之间的关系如下图所示。

JProfiler agent

JProfiler agent 是一个本地库,它可以在 JVM 启动时通过参数-agentpath:进行加载或者在程序运行时通过 JVM Attach 机制进行加载。Agent 被成功加载后,会设置 JVMTI 环境,监听虚拟机产生的事件,如类加载、线程创建等。例如,当它监听到类加载事件后,会给这些类注入用于执行度量操作的字节码。

JVM Attach 机制 相关优秀文章

JProfiler UI

JProfiler UI 是一个可独立部署的组件,它通过 socket 和 agent 建立连接。这意味着不论目标 JVM 运行在本地还是远端,JProfiler UI 和 agent 间的通信机制都是一样的。

命令行工具

JProfiler 提供了一系列命令行工具以实现不同的功能。

  1. jpcontroller - 用于控制 agent 的采集行为。它通过 agent 注册的 JProfiler MBean 向 agent 传递命令。
  2. jpenable - 用于将 agent 加载到一个正在运行的 JVM 上。
  3. jpdump - 用于获取正在运行的 JVM 的堆快照。
  4. jpexport & jpcompare - 用于从保存的快照中提取数据并创建 HTML 报告。

安装配置

  1. 本地连接
  2. 远程连接(ssh tunnel/socks proxy)所以,也可以调试线上的机器

实用功能简介

方法耗时

内存占用

jdbc分析