YourKit Java Profiler 教程
文章目录
- YourKit Java Profiler 教程
- 本教程软件版本说明
- YourKit
- IntelliJ Idea
- 系统要求
- 探查器体系结构
- 探查器代理
- 探查器用户界面
- 开始分析
- 集成环境集成
- IntelliJ Idea 安装插件
- IntelliJ Idea分析
- 解决性能问题
- 性能瓶颈
- 优化内存使用
- 内存泄漏
- 垃圾分配过多
- 中央处理器分析
- 采样
- 死锁检测器
- 垃圾回收
- 垃圾回收遥测
- 实际使用
- sql执行耗时场景
- 查看数据库执行情况界面
- 模拟 OOM
- 模拟死锁
官网教程地址:YourKit Java Profiler help
本教程软件版本说明
YourKit
YourKit Java Profiler 2022.9-b171
- 安装教程:YourKit 2022 使用教程-CSDN社区
IntelliJ Idea
IntelliJ IDEA 2022.3.2 (Ultimate Edition)
系统要求
YourKit Java Profiler
由两部分组成:分析器UI
(桌面应用程序)和 加载到Java
虚拟机 (JVM
) 中的探查器代理程序。 探查器UI
和探查器代理可以在具有不同 操作系统,因此它们有不同的系统要求。
探查器体系结构
YourKit Java Profiler
由两部分组成,通过网络交互:profiler
代理和profiler UI
探查器代理
- 是
Java
虚拟机的插件。 它可以在启动时加载到JVM
中,借助特殊的命令行选项,或者它可能会稍后附加到正在运行的JVM
。-agentpath -agentlib
代理使用操作系统API
、JVMTI
和字节码检测 以收集性能数据。 为了与其他应用程序通信,代理会打开TCP/IP
套接字并侦听其上的命令。
探查器用户界面
- 探查器
UI
(或简称UI
)是一个桌面应用程序。UI
可以连接到探查器代理以更改分析模式并获取 实时性能数据。UI
能够将性能数据保存到 用于进一步离线分析的快照。
开始分析
您可以使用不同的选项来开始分析应用程序:
Profiler
与大多数流行的Java IDE
无缝集成。 安装插件后,您将能够分析所有类型的Java
直接来自IDE
的应用程序。- 如果要分析独立的
Java
服务器(Tomcat
,Jetty
等)或应用程序, 您可以使用Java
服务器集成向导。 - 将探查器附加到正在运行的应用程序。
- 在以下情况下,可以远程完成分析: 应用程序在另一台计算机上运行。
- 在
Docker
容器中进行分析。 - 手动启用应用程序的分析
集成环境集成
IDE
集成提供:
- 能够直接从
IDE
启动分析的应用程序 - 从分析结果到分析的应用程序源代码的轻松导航
IntelliJ Idea 安装插件
next
之后选择Idea
安装插件的目录
- 如果重启
Idea
时候报错:到刚才选择的插件的目录将yourkit-for-idea.jar
移出来,使用Idea
从硬盘安装插件的方式安装即可成功。
com.intellij.diagnostic.PluginException: Fatal error initializing 'com.yourkit.ideaPlugin.Plugin' [Plugin: YourKit Java Profiler 2022.9-b171 Integration]
- 安装之后重启
Idea
IntelliJ Idea分析
-
启动需要分析的项目
-
启动成功
YourKit
界面如下
解决性能问题
性能瓶颈
- 使用探查器运行应用程序
- 连接到应用程序
- 在任务启动之前立即启动
CPU
分析 - 等到任务完成或执行足够长的时间
- 捕获性能快照
- 打开快照并使用
CPU
选项卡
优化内存使用
优化内存使用
- 使用探查器运行应用程序
- 连接到应用程序。不要记录分配,因为它们不是解决此任务所必需的。
- 捕获内存快照。
- 打开快照并使用对象视图
内存泄漏
-
内存遥测: 通过观察已用内存的增长。 您可以使用强制垃圾回收来 立即查看是否可以收集一些消耗内存的对象,从而 减少已用内存。如果在
2-3
次显式垃圾回收后,使用的内存仍然存在 在同一水平或减少不显着,这可能意味着您有泄漏。 (可能”,因为它可能不是泄漏,而只是高 内存消耗 – 了解如何处理这种情况)还要考虑高内存使用率捕获快照功能。 使用此功能自动捕获的快照可能会在状态中捕获 当内存使用量由于内存泄漏而达到指定的阈值时。 因此,快照将提供足够的信息来发现和修复泄漏。 -
若要检测内存泄漏,请使用以下方案:
-
连接到分析的应用程序
-
在执行怀疑导致泄漏的任务之前提前生成编号。
-
让应用程序执行任务。
-
捕获内存快照并将其打开。
-
使用世代”视图查看在任务执行期间创建的对象;泄漏的对象应该在其中。
-
垃圾分配过多
- 使用探查器运行应用程序
- 连接到应用程序
- 垃圾回收遥测将帮助你估计垃圾回收器负载。
中央处理器分析
- 当探查器连接到所分析的应用程序时, 工具栏包含以下
CPU
分析控件:
捕获性能快照并保存性能分析结果 到文件进行全面分析 | |
---|---|
启动/停止 CPU 分析。 | |
重置记录的 CPU 分析结果并继续 CPU 分析。 |
- 实时结果
- 启动
CPU
分析后,结果立即可用 在调用树中 - 合并所有线程、调用树 - 按线程、CPU
选项卡上的火焰图和方法列表部分。 - 在
CPU
跟踪的情况下,将显示方法时间和调用计数。 在CPU
采样的情况下,仅显示时间。
- 启动
- 完成测量并获得结果:当您打算分析的任务已完成(或已执行足够长的时间)时, 捕获包含所有记录信息的性能快照。
- 从探查器
UI
完成此操作后,可以打开结果进行即时分析。
采样
- 采样是
CPU
分析模式之一。 - 使用采样时,探查器会定期查询堆栈和正在运行的线程的时间 以估计代码中最慢的部分。 在此模式下,方法调用计数不可用。
- 使用探查器工具栏启动
CPU
采样,如下图所示。 还有启动CPU
分析的替代方法。
死锁检测器
- 如果在所分析的应用程序中发生
Java
级死锁,则会自动检测到锁。连接到分析的应用程序时, 切换到死锁选项卡。
垃圾回收
垃圾回收遥测
- 内存选项卡中显示的垃圾回收遥测图 将帮助您估计垃圾回收器负载。 如果垃圾回收需要大量时间,建议 运行对象分配记录以精确定位和优化有问题的代码。垃圾回收和
GC
中花费的时间图表始终可用。
实际使用
sql执行耗时场景
- 场景描述:总共有
10
万数据,接口需要将这10
万数据进行写入到表中 - 操作这个功能,这里测试使用
Apifox
直接调用接口,使用YourKit
捕获快照,打开快照进行分析
查看数据库执行情况界面
- 通过下入中展示的发现,
insert
语句执行耗时较长,直接发现了问题所在 - 找到执行慢的
sql
使用sql
优化的方式对这个sql
进行分析优化
模拟 OOM
- 不断的查询结果放到集合中
@Override
public void outOfMemory() {
List<TableClazzDO> userList = new ArrayList();
while (true) {
List<TableClazzDO> tableClazzDOS = tableClazzDOMapper.selectByExample(new TableClazzDOExample());
userList.addAll(tableClazzDOS);
}
}
模拟死锁
- 查看线程情况界面如下:点击线程可以大概排查出发生死锁的位置,这个界面可以找到发生阻塞的线程
- 在死锁的这个界面也可以直接看到有死锁的地方,通过这个可以大致定位到死锁的线程并处理这个问题