JVM性能分析工具JProfiler的使用
一、基本概念
JProfiler:即“Java Profiler”,即“Java分析器”或“Java性能分析工具”。它是一款用于Java应用程序的性能分析和调试工具,主要帮助开发人员识别和解决性能瓶颈问题。
JVM:即“Java Virtual Machine”,即“Java虚拟机”。它是一个用于运行Java字节码的抽象计算机。
(JProfiler分析的对象是Java应用程序,而这些程序都运行在JVM之上,JProfiler通过与JVM交互,收集有关CPU使用、内存分配、线程状态等详细信息。JVM提供的这些数据是JProfiler分析性能瓶颈、内存泄漏、线程死锁等问题的基础。由于JVM执行的是Java字节码,JProfiler可以直接分析字节码级别的代码执行情况,从而精确定位到方法调用、代码路径等细节。)
内存:是计算机中用来临时存储运行程序和数据的地方,运行中的数据和程序需要载入内存,计算机才能对其进行处理。
(某些对象由于逻辑问题没有被释放时,内存将逐渐耗尽,导致程序崩溃。JProfiler可以帮助检测内存泄漏,找出不再使用却没有释放的对象,也可以通过JProfiler监控内存使用的高峰时刻,帮助识别应用在负载高峰时的内存需求,确保程序在高压力环境下稳定运行。)
CPU:即“中央处理器”。它是计算机系统的核心处理单元,负责执行指令和处理数据,相当于计算机的大脑。
(在JProfiler中的主要作用是分析Java应用程序对CPU资源的使用情况。JProfiler能显示各个方法的CPU使用情况,帮助开发者找到耗费CPU资源最多的代码部分,识别性能瓶颈。”热点”代码,即在CPU使用中最频繁被调用的方法或函数,可以协助开发者优化这些代码以提升整体性能。)
SSH:SSH 是 "Secure Shell" 的缩写,是一种网络协议,用于安全地远程登录到另一台计算机上,执行命令和传输文件。
(SSH隧道提供了一种安全的方式,使得JProfiler可以从本地机器连接到远程服务器上的JVM,而不需要直接在网络上暴露JVM的管理端口。windows上查看SSH服务是否安装Get-Service -Name sshd,开启SSH服务Start-Service -Name sshd;另外对比TCP,TCP 属于传输层协议,主要目的是提供一种可靠的端到端的数据传输服务,而 SSH 是一种应用层协议,它通常使用 TCP 作为其底层传输机制,主要目的是提供安全的远程登录和其他安全服务。)
二、操作步骤
1、连接JVM
1.1、分析本地JVM
attach模式选择本地JVM快速连接
它可以用来分析本地的CPU状况及除数组内存数据以外的内存状况
launch模式选择应用程序
选择jar包后点击开始会由JProfiler启动JVM,它本质也会在启动的时候添加代理,所以可以完整的分析CPU状况及内存状况(包括数组内存数据)
1.2、分析远程JVM
attach模式选择远程JVM配置连接
连接远程JVM,windows系统需要手动下载配置代理,其他系统则不需要
(在windows系统中,在远程目标机器上将下载的jprofiler代理文件解压后,在jar包启动文件的命令中增加-agentpath设置代理,命令为 java -agentpath:"C:\Program Files\jprofiler14\bin\windows-x64\jprofilerti.dll=port=8890,nowait" -jar ectd-admin-web-v3.0.6.jar 。在会话设置中,需要手动指定分析的代理端口为8890)
2、内存分析
2.1、功能介绍
使用上述红框框出来的三部分功能进行内存的分析,这里对这些功能进行简要的介绍
遥测
内存:可以查看当前系统的内存整体情况,进而判断系统中是否存在严重的内存问题(比如内存泄漏或内存溢出)
实时内存
所有对象:显示当前系统的整体内存分配情况
记录的对象:显示点击 记录内存 后的所有对象的内存情况,并且可以选择活性模式(显示存活对象或垃圾回收对象),然后可以点击某个对象显示分配热点或分配调用树情况
分配调用树:显示点击点击 记录内存 后,具有调用树结构的内存分配情况,并且可以选择活性模式,以及特定类型的对象进行查看
分配热点:显示点击点击 记录内存 后,分配频率高的对象,可以以对象为维度去查看调用出处,并且也可以选择活性模式,以及特定类型的对象进行查看
类跟踪器:可以在前面从记录的对象中选择对象添加到类跟踪器中,查看特定对象内存的变化和释放
堆遍历器
选择生成快照或在记录对象中选择指定对象在堆遍历器中查看,堆遍历器快照只显示无引用链的对象(包括GC的对象以及暂时存活未被GC但无引用的对象),通过堆遍历器快照可查看异常未回收对象被谁所持有从而找出内存溢出问题
2.2、分析步骤
2.2.1、首先查看遥测中的内存总览,查看内存是否存在高占用的情况
2.2.2、查看实时内存中的所有对象,初步查看内存中已经存在的占用高内存的对象是谁
2.2.3、复现场景并记录分配调用栈数据,并设置调用树分配选项为所有类和所有对象,查看分配调用树,确定占用高内存的对象的代码位置(使用分配热点根据对象反向查看调用位置也可以)
2.2.4、将异常对象添加到类跟踪器,结合代码确认对象内存是否正常释放而不存在内存泄漏问题
2.2.5、假如高占用内存的对象已经确定且无内存泄漏,查看其在堆内快照的引用,判断是否被不正确的持有未释放而导致内存溢出问题
3、CPU分析
3.1、功能介绍
使用上述红框框出来的三部分功能进行CPU的分析,这里对这些功能进行简要的介绍
遥测
CPU负载:可以查看当前系统的CPU负载整体情况,判断系统中是否存在CPU使用率过高的问题
CPU视图
调用树:显示点击 记录CPU 后,当前程序中各个方法或线程的 CPU 使用情况,并且可以选择具体的线程及线程状态进行筛选
热点:显示点击 记录CPU 后,列出消耗最多资源的方法或类,通常是性能瓶颈所在的地方,并且可以选择具体的线程及线程状态进行筛选
调用图:显示点击 记录CPU 后,局部线程调用的CPU使用情况,并且可以选择具体的线程中的节点作为最初显示的节点去创建调用图
异常值检测:显示点击 记录CPU 后,存在相较于自身平均调用时间特别突出(异常系数)的方法
其他功能项不常用略过
3.2、分析步骤
3.2.1、首先查看遥测中的CPU负载总览,查看内存是否存在高使用的情况
3.2.2、复现场景并记录CPU数据,查看调用树或者热点确定CPU占用率高的方法的代码位置(如果有需要也可也对指定调用的线程方法设置线程图更加简明的查看)
3.2.3、查看异常值检测,排除存在异常的方法如有必要进行进一步的分析
总结
JProfiler通过给JVM启动添加代理去追踪和记录相关内存及CPU数据以不同的形式呈现出来,关键点在于根据需求决定呈现形式的参数或配置
三、额外补充
1、其他子系统探针

如图,为JProfiler为JRE中的重要子系统提供了一些探针。探针将instrumentation添加到特定的类中,以便收集其数据,从运行的应用程序中提取语义数据,并将其显示在分析器中。
现在介绍其中部分常用的几个探针:
数据库
JDBC:当点击记录探针JDBC及记录CPU后,即可完整查看JDBC探针数据,包括时间线、连接情况、在调用树中的耗时,热点、还有执行情况总览等,有助于分析SQL中引起的性能瓶颈
HTTP,RPC & JEE
HTTP服务器:点击 记录探针HTTP服务器 ,可以查看来自浏览器等客户端传入的HTTP请求状况,包括请求的热点、总览等
HTTP客户端:点击 记录探针HTTP客户端 ,可以查看从服务器传出的HTTP请求状况,包括请求的调用树(需要开启记录CPU)、热点、总览等
2、IntelliJ IDEA集成
在IDEA的设置——插件中搜索JProfiler然后安装,安装完成后重启IDEA即可使用JProfiler启动,这样启动时会直接拉起JProfiler进行相关数据的统计,并且在调用书中点击显示源码时,可直接跳转到IDEA中显示对应的代码位置
3、手动添加源码
通过上述方式可添加源码,这样在调用树中双击即可查看源码(但是只是定位到类)
通过上述方式可在调用树上增加代码行数的显示,这样方便在显示的源代码类中找到对应行
4、性能问题与配置
JProfiler连接到JVM后,会对其性能造成一定的影响。这种性能影响的程度与JProfiler的配置和使用的功能模块有关。具体影响方面比如监控开销(在目标JVM中插入探针来跟踪方法调用,这会增加额外的计算和内存开销)、内存开销(维护大量的数据结构来存储分析信息,比如堆栈数据等)、网络通信(远程连接)、IO影响(快照写入)等。
需要注意的配置和操作
方法调用记录类型:对于I/O密集型(输入输出频率高,比如磁盘、数据库、REST请求)选择Instrumentation模式(会修改选定类的字节码以跟踪方法的进入和退出),选择指定的方法或包,可以更详细的查看方法的信息包括调用次数;对于计算密集型(CPU运算和数据处理强度高,比如图片视频文档分析处理、大规模运算、加解密)选择异步采样,可以获取更准确的CPU时间;其他情况一般选择全采样即可
采样频率:如果将方法调用记录类型设置为采样,采样频率越高,数据越详细,但性能开销也越大。可以在 方法调用记录 中选择采用间隔的ms数控制
方法忽略:如果将方法调用记录类型设置为instrumentation,所有分析类的方法都会被测量,这对于执行时间很短的方法来说, 会产生很大的开销。为了缓解instrumentation的问题,JProfiler有一个叫做自动调节的机制。分析代理会不时地检查instrumentation开销很高的方法, 并将它们传送到JProfiler GUI中,可以单击该状态栏条目来查看检测到的开销热点,并选择将其纳入忽略方法列表。在 高级设置 的 CPU分析 中可以开启或关闭自动调节
触发器设置:可以在 会话设置 中的 触发器设置 中设置触发器条件,合理设置触发器可以减少不必要的数据收集,降低性能开销。比如设置 CPU 使用率超过某个阈值时开始收集数据,或者置特定方法调用次数超过某个阈值时开始收集数据
避免多开:比如同时开启CPU记录和分配记录,或者还有其他比如JDBC、HTTP探针等,尽量需要查看哪个记录哪个模块,不用的就停止记录
相关文章:

JVM性能分析工具JProfiler的使用
一、基本概念 JProfiler:即“Java Profiler”,即“Java分析器”或“Java性能分析工具”。它是一款用于Java应用程序的性能分析和调试工具,主要帮助开发人员识别和解决性能瓶颈问题。 JVM:即“Java Virtual Machine”,…...
面试题: Spring中的事务是如何实现的?
Spring中的事务是如何实现的? 背景个人原因的背景正规一点的背景 答案一些思绪和灵感个人理解程度拓展知识Spring的事务管理主要涉及哪几个类?在Spring中,事务管理的流程是怎样的? 背景 个人原因的背景 想换工作, 刷面试题看到的问题, 简单记录一下, 算是个人…...
vue2-代理服务器插槽
解决跨域问题 配置代理服务器 代理服务器位于前端应用(客户端)和真实的后端服务器之间。当配置了代理服务器后,前端应用的请求不再直接发送到后端服务器,而是发送到代理服务器。代理服务器在接收到请求后,会根据预先配置的规则将请求转发到真…...

(python)unittest框架
unittest unnitest介绍 TestCase测试用例 书写真正的用例脚本...
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务 IDS入侵检测系统 Intrusion Detection System 安全检测系统,通过监控网络流量、系统日志等信息,来检测系统中的安全漏洞、异常行为和入侵行为。 分为&am…...
面试小结(一)
1、hashmap的底层设计原理以及扩容规则,是否线程安全,如何线程安全。 底层原理:数组 链表 红黑树。HashMap 的底层实现是一个数组,数组中的每个元素是一个链表或红黑树(JDK 1.8 以后,当链表长度超过一定…...
笔试-笔记2
1.设存在函数int max(int,int)返回两参数中较大值,若求22,59,70三者中最大值,下列表达式不正确的是() A.int mmax(22,59,70); B.int mmax(22,max(59,70)); C.int mmax(max(22,59),70); D.int mmax(59,max(22,70)); 解析…...
html5复习二
知识点: 1、音频标签 <audio controls"controls" loop"loop" preload"auto" src"张恒远 - 追梦赤子心.mp3" muted"muted" > </audio> controls:显示控件 必须写 loop:循环播放&#x…...
大模型呼入机器人系统如何建设?
大模型呼入机器人系统如何建设? 作者:开源呼叫中心系统 FreeIPCC, Github地址:https://github.com/lihaiya/freeipcc 大模型呼叫中心呼入机器人系统的建设是一个涉及多个环节和领域的综合性工程。以下是一个详细的步骤指南,涵盖了…...

docker 部署 kvm 图形化管理工具 WebVirtMgr
镜像构建 官方最后一次更新已经是 2015年6月22日 了,官方也没有 docker 镜像,这边选择咱们自己构建如果你的服务器有魔法,可以直接 git clone 一下 webvirtmgr 的包,没有的话,可以和我一样,提前从 github 上…...

【Unity How】Unity中如何实现物体的匀速往返移动
直接上代码 using UnityEngine;public class CubeBouncePingPong : MonoBehaviour {[Header("移动参数")][Tooltip("移动速度")]public float moveSpeed 2f; // 控制移动的速度[Tooltip("最大移动距离")]public float maxDistance 5f; // 最大…...

Block Successive Upper Bound Minimization Method(BSUM)算法
BSUM优化方法学习 先验知识参考资料1 A Unified Convergence Analysis of Block Successive Minimization Methods for Nonsmooth OptimizationSUCCESSIVE UPPER-BOUND MINIMIZATION (SUM) 连续上限最小化算法THE BLOCK SUCCESSIVE UPPER-BOUND MINIMIZATION ALGORITHM 块连续上…...
力扣2388. 将表中的空值更改为前一个值
一、数据 2388. 将表中的空值更改为前一个值 表: CoffeeShop ---------------------- | Column Name | Type | ---------------------- | id | int | | drink | varchar | ---------------------- id 是该表的主键(具有唯一值的列…...

【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量
给你两个 正整数 l 和 r。对于任何数字 x,x 的所有正因数(除了 x 本身)被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数,则称该数字为 特殊数字。例如: 数字 4 是 特殊数字,因为它的真因数为 1 和…...

Redis配置主从架构、集群架构模式 redis主从架构配置 redis主从配置 redis主从架构 redis集群配置
Redis配置主从架构、集群架构模式 redis主从架构配置 redis主从配置 redis主从架构 redis集群配置 1、主从模式1.1、主节点配置1.2、从节点配置1.3、测试 2、集群模式 1、主从模式 1.1、主节点配置 # 监听所有网络接口 bind 0.0.0.0# cluster-enabled表示为集群模式ÿ…...
2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略 完整参考论文(2)
5.2 问题一模型的建立与求解 5.2.1 分析发展情况 为了更好地理解数据的变化趋势,利用matlab通过六个子图对宠物行业中的关键变量进行了可视化展示。 图 1. 宠物数量变化展示了 猫数量、狗数量 和 总宠物数量 在 2019-2023 年间的变化趋势。结果显示:猫的数量呈逐年上升的趋…...

HTML实现 扫雷游戏
前言: 游戏起源与发展 扫雷游戏的雏形可追溯到 1973 年的 “方块(cube)” 游戏,后经改编出现了 “rlogic” 游戏,玩家需为指挥中心探出安全路线避开地雷。在此基础上,开发者汤姆・安德森编写出了扫雷游戏的…...

day03(单片机高级)RTOS
目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台(中断方式) 改进(前后台(中断))定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…...

【mongodb】社区版8:改变配置bindip和授权
更改配置 sudo systemctl restart mongod (base) root@k8s-master-pfsrv:/home/zhangbin# sudo tail -n 20 /var/log/mongodb/mongod.log 日志感觉是成功了:{"t":{"$date":"2024-11-19T19:57:47.076+08:00"...

泥石流灾害风险评估与模拟丨AI与R语言、ArcGIS、HECRAS融合,提升泥石流灾害风险预测的精度和准确性
目录 第一章 理论基础 第二章 泥石流风险评估工具 第三章 数据准备与因子提取 第四章 泥石流灾害评价 第五章 HECRAS软件的应用 第六章 操作注意事项与模型优化 泥石流灾害的频发与严重后果,已成为全球范围内防灾减灾工作的重大挑战。随着科技的不断进步&…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...