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探针等,尽量需要查看哪个记录哪个模块,不用的就停止记录
        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/919406.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css鼠标移动效果高亮追随效果

如图所示&#xff0c;鼠标移动有一块高亮随着鼠标移动。代码如下&#xff1a;(vue3篇) <div class"container"><span class"use-hover-hglh-element trail" :style"isShow ? dyStyle : { opacity: 0 }"></span></div>…

PHP屏蔽海外IP的访问页面(源代码实例)

PHP屏蔽海外IP的访问页面&#xff08;源代码实例&#xff09;&#xff0c;页面禁用境外IP地址访问 <?php/*** 屏蔽海外ip访问* 使用ip2long函数得到ip转为整数的值&#xff0c;判断值是否在任一一个区间中* 以下是所有国内ip段* 调用方法&#xff1a;IschinaIp($ALLIPS)* …

现代分布式系统新法宝:基于单元的架构

- 前言 - 数十年来&#xff0c;IT 业界一直在努力掌握分布式系统。然而&#xff0c;随着系统日益复杂&#xff0c;给开发数字产品的组织带来巨大挑战。可以说&#xff0c;分布式系统最棘手的方面之一是面对故障时的可靠性&#xff0c;特别是现代分布式系统使用大量物理与虚拟资…

2.8 群辉 黑群晖 意味断电 抱歉,您所指定的页面不存在。

实验室组装的黑群晖施工时不小心被意味断电&#xff0c;然后出现了如下图&#xff1a; 对于7.1.1的系统来说&#xff0c;这个是由于libsynopkg.so.1和libsynoshare.so.7这两个文件出问题所致。 因此&#xff0c;解决方法也比较简单就是把好的文件恢复到/lib文件夹下即可。 这…

【视频讲解】Python深度神经网络DNNs-K-Means(K-均值)聚类方法在MNIST等数据可视化对比分析...

全文链接&#xff1a;https://tecdat.cn/?p38289 分析师&#xff1a;Cucu Sun 近年来&#xff0c;由于诸如自动编码器等深度神经网络&#xff08;DNN&#xff09;的高表示能力&#xff0c;深度聚类方法发展迅速。其核心思想是表示学习和聚类可以相互促进&#xff1a;好的表示会…

K8S资源限制之ResourceQuota

ResourceQuota介绍 在K8S中&#xff0c;大部分资源都可以指定到一个名称空间下&#xff0c;因此可以对一个名称空间的计算资源&#xff0c;存储资源&#xff0c;资源数量等维度做资源限制。 如限制pod数量、svc数量&#xff0c;控制器数量&#xff0c;限制PVC请求的存储量 注…

【Android原生问题分析】夸克、抖音划动无响应问题【Android14】

1 问题描述 偶现问题&#xff0c;用户打开夸克、抖音后&#xff0c;在界面上划动无响应&#xff0c;但是没有ANR。回到Launcher后再次打开夸克/抖音&#xff0c;发现App的界面发生了变化&#xff0c;但是仍然是划不动的。 2 log初分析 复现问题附近的log为&#xff1a; 用户…

[JavaWeb]微头条项目

完整笔记和项目代码&#xff1a; https://pan.baidu.com/s/1PZBO0mfpwDPic4Ezsk8orA?pwdwwp5 提取码: wwp5 JavaWeb-微头条项目开发 1 项目简介 1.1 业务介绍 微头条新闻发布和浏览平台,主要包含业务如下 用户功能 注册功能登录功能 头条新闻 新闻的分页浏览通过标题关键字搜…

AJAX学习(24.11.1-24.11.14)(包含HTTP协议)

AJAX学习&#xff08;24.11.1-11.14) 来源&#xff1a; 传智 | 高校学习平台-首页 传智播课&#xff1a;黑马程序员 1.服务器和客户端 1.服务器&#xff1a;存放和对外提供资源的电脑。 2.客户端&#xff08;用户&#xff09;&#xff1a;获取和消费资源的电脑。&#xff0…

9.《滑动窗口篇》---①长度最小的子数组(中等)

滑动窗口推导过程 我们不能说一上来就知道这个题目用滑动窗口&#xff0c;然后就使用滑动窗口的方法来做这个题目。 首先我们想到的应该是暴力解法。 接着再优化为滑动窗口 由于数字都是 ≥ 0 的数。因此累加的数越多。和越大。 因此right往后遍历的时候。当发现sum > targe…

《Python网络安全项目实战》项目5 编写网站扫描程序

《Python网络安全项目实战》项目5 编写网站扫描程序 项目目标&#xff1a;任务5.1 暴力破解网站目录和文件位置任务描述任务分析任务实施相关知识任务评价 任务5.2 制作网页JPG爬虫任务分析任务实施相关知识任务评价任务拓展 WEB网站安全渗透测试过程中需要进行目录扫描和网站爬…

React(二)

文章目录 项目地址七、数据流7.1 子组件传递数据给父组件7.1.1 方式一:給父设置回调函数,传递给子7.1.2 方式二:直接将父的setState传递给子7.2 给props传递jsx7.2.1 方式一:直接传递组件给子类7.2.2 方式二:传递函数给子组件7.3 props类型验证7.4 props的多层传递7.5 cla…

Python学习29天

二分查找 # 定义函数冒泡排序法从大到小排列 def bbble_sort(list):# i控制排序次数for i in range(len(list) - 1):# j控制每次排序比较次数for j in range(len(list) - 1 - i):if list[j] < list[j 1]:list[j], list[j 1] list[j 1], list[j] # 定义二分查找函数 def…

【工控】线扫相机小结 第三篇

海康软件更新 目前使用的是 MVS_STD_4.3.2_240705.exe &#xff0c;最新的已经到4.4了。 一个大的变动 在上一篇中我们提到一个问题&#xff1a; 需要注意的是&#xff0c;我们必须先设置 TriggerSelector 是 “FrameBurstStart” 还是 “LineStart” 再设置TriggerMode 是 …

K8S资源限制之LimitRange

LimitRange介绍 LimitRange也是一种资源&#xff0c;在名称空间内有效&#xff1b;限制同一个名称空间下pod容器的申请资源的最大值&#xff0c;最小值pod的resources中requests和limits必须在这个范围内&#xff0c;否则pod无法创建。当然pod也可以不使用resources进行创建ty…

Maven maven项目构建的生命周期 Maven安装配置 IDEA 配置 Maven

一&#xff0c;Maven的概述 Maven的作用&#xff1a;专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;提…

Rust “xxx“.to_string()和Rust String::from(“xxx“)区别(将字符串字面量(str类型)转换为String类型)

文章目录 Rust "xxx".to_string()和Rust String::from("xxx")区别1. .to_string()&#xff08;能够将任何可以显示的类型&#xff08;如数字、结构体等&#xff09;转为字符串&#xff09;2. String::from()区别总结&#xff1a;性能&#xff1a;示例对比&…

Windows仿macOS?看这一篇就够了

如果你有任何关于Windows仿macOS的问题&#xff0c;可加入942644281 &#xff08;QQ群&#xff09; Date9.20更新&#xff1a;增加功能按键左移部分Date9.16更新&#xff1a;增加了大多数资源的网盘链接Date9.15更新&#xff1a;增加StartAllBack&#xff0c;资源管理器调整部…

Django数据迁移出错,解决raise NodeNotFoundError问题

错误出现在&#xff1a; raise NodeNotFoundError(self.error_message, self.key, originself.origin) django.db.migrations.exceptions.NodeNotFoundError: Migration myApp.0003_alter_jobinfo_practise dependencies reference nonexistent parent node (myApp, 0002_renam…

PaddleNLP的环境配置:

PaddleNLP的环境配置&#xff1a; conda create -n paddle—test python3.9conda activate paddle—testpython -m pip install paddlepaddle-gpu2.6.1.post112 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html(paddle—test) (venv) PS D:\work\论文写…