# 性能诊断 JProfiler 工具使用

性能诊断 JProfiler 工具使用

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

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

安装方法

  • JProfiler Help - Installing (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
    在这里插入图片描述

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

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

相关文章

shallowRef和shallowReactive的使用?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、 shallowRef&#xff1f;二、 shallowReactive&#xff1f;在什么时候使用&#xff1f; 三、案例1、shallowRef2、shallowReactive 提示&#xff1a;以下是本篇…

App Store上线APP流程

现在App Store上已经有数百万款应用&#xff0c;因此对于App的规范要求也越来越高&#xff0c;对于新上线的APP需要满足这些规则并不是件容易的事。今天和大家分享这方面的知识&#xff0c;希望大家喜欢。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff…

浙大数据结构第六周之初识图

题目详情&#xff1a;06-图1 列出连通集 给定一个有N个顶点和E条边的无向图&#xff0c;请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时&#xff0c;假设我们总是从编号最小的顶点出发&#xff0c;按编号递增的顺序访问邻接点。 输入格式: 输入第1…

飞书接入ChatGPT - 将ChatGPT集成到飞书机器人,直接拉满效率

文章目录 前言环境列表视频教程1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 转载自远控源码文章&#xff1a;飞书接入ChatGPT - 将ChatGPT集…

服务(第二十八篇)rsync

配置rsync源服务器&#xff1a; #建立/etc/rsyncd.conf 配置文件 vim /etc/rsyncd.conf #添加以下配置项 uid root gid root use chroot yes #禁锢在源目录 address 192.168.80.10 …

庄懂的TA笔记(十四十六)<特效:火焰 + 水流>

庄懂的TA笔记&#xff08;十四&十六&#xff09;&#xff1c;特效&#xff1a;火焰 水流&#xff1e; 目录 一、作业展示&#xff1a; 二、示范&#xff1a;火: 参考资料&#xff1a; 实现思路&#xff1a; 实践操作&#xff1a; 三、示范&#xff1a;水: 实现思路&am…

PCB 布线技术~PCB结构:Traces,电源平面

PCB导体:Traces • 铜是PCB中最常用的导体 – 走线或连接器一般通过镀金来提供一个抗腐蚀的电传导特性 – 走线的宽度和长度-由PCB布线工程师控制 • 在通常的制造工艺下&#xff0c;走线的宽度和之间的间距一般要≥5 mil – 走线厚度-制造工艺的变量 • 典型值 0.5oz – 3oz •…

C++(2):变量和基本类型

基本内置类型 C定义了一套包括算术类型&#xff08;arithmetic type&#xff09;和空类型&#xff08;void&#xff09;在内的基本数据类型。其中算术类型包含了字符、整型数、布尔值和浮点数。空类型不对应具体的值。 算数类型 算数类型分为两类&#xff1a;整型&#xff0…

【Linux】多种环境变量介绍与设置

文章目录 一. linux环境变量介绍1. linux中的环境变量配置文件2. 环境变量加载顺序 二. 操作环境变量1. 读取环境变量envexportecho $PATH 2. 设置环境变量2.1. export PATH&#xff1a;临时的环境变量2.2. 用户的环境变量vim ~/.bashrcvim ~/.bash_profile 2.3. 所有用户的环境…

网络原理(四):传输层协议 TCP/UDP

目录 应用层 传输层 udp 协议 端口号 报文长度&#xff08;udp 长度&#xff09; 校验和 TCP 协议 确认应答 超时重传 链接管理 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 总结 我们第一章让我们对网络有了一个初步认识&#xff0c;第二章和第三章我们通…

SpringBoot 整合 ChatGPT API 项目实战

SpringBoot 整合 ChatGPT API 项目实战 一、准备工作 二、补全接口示例 三、申请API-KEY 四、JavaScript调用API 五、SpringBoot使用ChatGPT API 体验到了ChatGPT的强大之后&#xff0c;那么我们会想&#xff0c;如果我们想基于ChatGPT开发一个自己的聊天机器人&#xff0…

论文、专利、文献检索及图像数据工具总结

一、文献检索 1、中文文献检索参考 中文文献途径网址用途1知网https://www.cnki.net/文献检索、下载2万方数据网https://www.wanfangdata.com.cn/文献检索、下载3维普期刊http://lib.cqvip.com/文献检索、下载4浙江图书馆https://www.zjlib.cn/#searchs_1_div文献检索、下载5…

html监听界面被隐藏或显示

vue相比于小程序和uni-app 显然少了两个有点用的生命周期 onShow 应用被展示 onHide 应用被隐藏 但其实这个 要做其实也很简单 JavaScript中 有对应的visibilitychange事件可以监听 我们Html参考代码如下 <!DOCTYPE html> <html lang"en"> <head>…

8. 机器学习系统设计

假设你想建立一个垃圾邮件分类器&#xff0c;通过监督学习来构造一个分类器来区分垃圾邮件和非垃圾邮件。为了应用监督学习&#xff0c;首先要想的就是&#xff1a;如何来表示邮件的特征向量x&#xff0c;通过特征向量x和分类标签y&#xff0c;我们就能训练一个分类器&#xff…

07-通过RocketMQ和Redis实现用户动态提醒

1、用户动态表 CREATE TABLE `t_user_moments` (`id` bigint(12) unsigned NOT NULL AUTO_INCREMENT COMMENT 主键id,`user_id` bigint(12) DEFAULT NULL COMMENT 用户id,`user_type` int(8) DEFAULT NULL COMMENT 动态类型:0视频 1直播 2专栏动态,`contend_id` bigint(12) D…

Linux下C/C++实现DNS查询(DNS QUERY)

DNS 的全称是 Domain Name System 或者 Domain Name Service&#xff0c;它主要的作用就是将人们所熟悉的网址 (域名) “翻译”成电脑可以理解的 IP 地址&#xff0c;这个过程叫做 DNS 域名解析。域名是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称&am…

从裸机启动开始运行一个C++程序(二)

先序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;一&#xff09; 运行在8086上的第一个程序 既然硬件环境已经就绪了&#xff0c;那接下来&#xff0c;就要想办法让它运行我们的程序了。不过在此之前&#xff0c;我们必须要了解一下8086的主要架构&#xf…

微星MSI GE66 10SF-416RU电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板Intel HM470 处理器Intel Core i7-10875H 2.30GHz up to 5.10GHz已驱动 内存Kingston Fury Impact DDR4 2x16Gb 3200mhz已驱动 硬盘NT…

【Linux】权限的理解

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

Apache Flink 文件上传漏洞 (CVE-2020-17518)

文章目录 一、Apache Flink简介二、漏洞简介三、漏洞复现四、上传jar包getshell 一、Apache Flink简介 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任…