JProfiler —CPU评测

    当JProfiler测量方法调用的执行时间及其调用堆栈时,我们称之为“CPU评测”。这些数据以多种方式呈现。根据你试图解决的问题,其中一个或另一个演示将是最有帮助的。默认情况下不会记录CPU数据,您必须打开CPU记录才能捕获有趣的用例。

一、调用树

跟踪所有方法调用及其调用堆栈将消耗大量内存,并且只能保持很短的时间,直到所有内存耗尽。此外,在繁忙的JVM中直观地掌握方法调用的数量并不容易。通常,这个数字太大了,无法定位和跟踪轨迹。
另一个方面是,许多性能问题只有在收集到的数据被聚合后才会变得清楚。通过这种方式,您可以判断方法调用在某个时间段内对整个活动的重要性。对于单个跟踪,您不知道所查看的数据的相对重要性。
这就是为什么JProfiler构建了一个所有观察到的调用堆栈的累积树,并用观察到的时间和调用计数进行注释。删除了按时间顺序排列的部分,只保留了总数。树中的每个节点表示一个调用堆栈,该堆栈至少被观察一次。节点具有代表在该调用堆栈中看到的所有传出调用的子级。

 调用树是“CPU视图”部分中的第一个视图,当您开始CPU评测时,它是一个很好的起点,因为方法调用从起点到最细粒度的终点的自上而下的视图最容易理解。JProfiler根据子级的总时间对其进行排序,因此您可以首先打开树深度来分析树中对性能影响最大的部分。

 虽然所有的测量都是针对方法执行的,但JProfiler允许您通过在类或包级别聚合调用树来获得更广泛的视角。聚合级别选择器还包含一个“JEE/Spring组件”模式。如果您的应用程序使用JEE或Spring,则可以使用此模式在类级别上仅查看JEE和Spring组件。像URL这样的拆分节点保留在所有聚合级别中。

二、调用树筛选器

如果调用树中显示了所有类的方法,则该树通常太深而无法管理。如果你的应用程序是由一个框架调用的,那么调用树的顶部将由你不关心的框架类组成,你自己的类将被深深地掩埋。对库的调用将显示其内部结构,可能有数百个级别的方法调用,这些调用您不熟悉,也无法影响。
这个问题的解决方案是对调用树应用过滤器,这样只记录一些类。作为一个积极的副作用,需要收集的数据更少,需要检测的类也更少,因此减少了开销。
默认情况下,配置分析会话时会使用一个从常用框架和库中排除的包列表。 

 当然,这个列表是不完整的,所以最好删除它并自己定义感兴趣的包。事实上,插装和默认过滤器的组合是非常不可取的,因此JProfiler建议在会话启动对话框中进行更改。

 过滤器表达式与完全限定的类名进行比较,因此com.mycorp.匹配所有嵌套包中的类,如com.mycorp.myapp.Application。有三种类型的过滤器,称为“profiled”、“compact”和“ignored”。“概要”类中的所有方法都是经过测量的。这是您自己的代码所需要的。
在“紧凑”过滤器所包含的类中,只测量对该类的第一次调用,但不显示进一步的内部调用。“Compact”是库(包括JRE)所需要的。例如,当调用hashMap.put(a,b)时,您可能希望在调用树中看到hashMap.put。
最后,“忽略”的方法根本没有被分析。由于开销方面的考虑,它们可能不适合使用,或者它们可能只是在调用树中分散注意力,例如插入动态调用之间的内部Groovy方法。
手动输入程序包容易出错,因此您可以使用程序包浏览器。在启动会话之前,包浏览器只能向您显示配置的类路径中的包,该路径通常不会覆盖实际加载的所有类。在运行时,包浏览器将显示所有加载的类。

为每个类从上到下评估配置的筛选器列表。在每个阶段,如果匹配,则当前过滤器类型可能会发生变化。什么样的过滤器从过滤器列表开始很重要。如果您从一个“profiled”过滤器开始,那么类的初始过滤器类型是“compact”,这意味着只对显式匹配进行分析。

如果您从一个“紧凑”过滤器开始,那么类的初始过滤器类型是“profiled”。在这种情况下,除了显式排除的类之外,所有类都将进行分析。

三、调用树时间

要正确解释调用树,了解调用树节点上显示的数字非常重要。任何节点都有两个有趣的时间,总时间和自身时间。自身时间是节点的总时间减去嵌套节点中的总时间。
通常,自时间很小,除了紧凑的过滤类。大多数情况下,紧凑过滤类是一个叶节点,总时间等于自身时间,因为没有子节点。有时,紧凑过滤类会调用一个配置文件类,例如通过回调,或者因为它是调用树的入口点,比如当前线程的run方法。在这种情况下,一些未编译的方法会消耗时间,但不会显示在调用树中。该时间冒泡到调用树中的第一个可用祖先节点,并为紧凑过滤类的自身时间做出贡献。 

调用树中的百分比栏显示总时间,但自身时间部分显示为不同的颜色。除非重载了同一级别上的两个方法,否则方法显示时没有其签名。有多种方法可以自定义视图设置对话框中调用树节点的显示。例如,您可能希望将自身时间或平均时间显示为文本,始终显示方法签名或更改使用的时间刻度。此外,百分比计算可以基于父时间,而不是整个调用树的时间。 

四、线程状态

在调用树的顶部,有几个视图参数可以更改所显示的分析数据的类型和范围。默认情况下,所有线程都是累积的。JProfiler在每个线程的基础上维护CPU数据,您可以显示单个线程或线程组。

 在任何时候,每个线程都有一个关联的线程状态。如果线程已准备好处理字节码指令,或者当前正在CPU核心上执行这些指令,则线程状态称为“可运行”。在查找性能瓶颈时,该线程状态是感兴趣的,因此默认情况下会选择它。
或者,线程可能正在监视器上等待,例如通过调用Object.wait()或thread.sleep(),在这种情况下,线程状态被称为“等待”。在尝试获取监视器时被阻塞的线程(例如在同步代码块的边界处)处于“阻塞”状态。
最后,JProfiler添加了一个合成的“Net I/O”状态,用于跟踪线程等待网络数据的时间。这对于分析服务器和数据库驱动程序非常重要,因为这段时间可能与性能分析相关,例如用于调查慢速SQL查询。

如果你对挂钟时间感兴趣,你必须选择线程状态“所有状态”,也可以选择一个线程。只有这样,您才能将时间与代码中调用System.currentTimeMillis()计算的持续时间进行比较。
如果您想将所选方法转移到不同的线程状态,可以使用方法触发器和“覆盖线程状态”触发器操作,或者使用嵌入或注入的探测API中的ThreadStatus类来实现。

五、在调用树中查找节点

有两种方法可以在调用树中搜索文本。首先,有一个快速搜索选项,它通过从菜单中调用View->Find或直接开始在调用树中键入来激活。按下PageDown后,匹配项将突出显示,搜索选项可用。使用“向上箭头”和“向下箭头”键,您可以在不同的匹配中循环。 

 搜索方法、类或包的另一种方法是使用调用树底部的视图过滤器。在这里,您可以输入一个逗号分隔的筛选器表达式列表。以“-”开头的筛选器表达式类似于被忽略的筛选器。以“!”开头的表达式类似于紧凑型过滤器。所有其他表达式都类似于配置文件过滤器。就像过滤器设置一样,初始过滤器类型决定了默认情况下是包括类还是排除类。
单击视图设置文本字段左侧的图标可显示视图过滤器选项。默认情况下,匹配模式为“包含”,但在搜索特定包时,“以开头”可能更合适。

六、火焰图

另一种查看调用树的方法是将其作为火焰图。通过调用关联的调用树分析,可以将整个调用树或其一部分显示为火焰图。 

 火焰图在一个图像中显示了调用树的全部内容。调用从火焰图的底部开始,并向顶部传播。每个节点的子节点排列在其正上方的行中。子节点按字母顺序排序,并以其父节点为中心。由于在每个节点中花费的自身时间,“火焰”向顶部逐渐变窄。有关节点的更多信息显示在工具提示中,您可以在其中标记文本以将其复制到剪贴板。

火焰图具有非常高的信息密度,因此可能有必要通过关注所选节点及其子节点层次来缩小显示的内容。虽然可以放大感兴趣的区域,但也可以通过双击或使用上下文菜单来设置新的根节点。当连续多次更改根时,可以在根的历史中再次向后移动。
分析火焰图的另一种方法是根据类名、包名或任意搜索项添加着色。着色可以从上下文菜单中添加,也可以在着色对话框中进行管理。第一个匹配的着色用于每个节点。除了着色之外,您还可以使用快速搜索功能来查找感兴趣的节点。使用光标键,可以在显示当前高亮显示的匹配的工具提示时循环显示匹配结果。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac如何打开隐藏文件中Redis的配置文件redis.conf

Redis下载(通过⬇️博客下载的Redis默认路径为:/usr/local/etc) Redis下载 1.打开终端进入/usr文件夹 cd /usr 2.打开/local/文件夹 open local 3.找到redis.conf并打开,即可修改配置信息

《Zookeeper》源码分析(九)之选举通信网络

在上一篇文章中讲到QuorumCnxManager,它负责zookeeper服务器在选举期间最底层的网络通信,整个网络涉及到的类如下: 整个网络建立的过程如下: 选举前创建好QuorumCnxManager实例,并在QuorumCnxManager构造函数中创建好…

解决selenium的“can‘t access dead object”错误

目录 问题描述 原因 解决方法 示例代码 资料获取方法 问题描述 在python执行过程中,提示selenium.common.exceptions.WebDriverException: Message: TypeError: cant access dead object 原因 原因是代码中用到了frame,获取元素前需要切换到frame才能定位到…

21 | 朝阳医院数据分析

朝阳医院2018年销售数据为例,目的是了解朝阳医院在2018年里的销售情况,通过对朝阳区医院的药品销售数据的分析,了解朝阳医院的患者的月均消费次数,月均消费金额、客单价以及消费趋势、需求量前几位的药品等。 import numpy as np from pandas import Series,DataFrame impo…

C++ 虚继承

C棱形继承 在 C 中,在使用 多继承 时,如果发生了如果类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这时候就发生了菱形继承。 如果发生了菱形继承,这个时候类 A 中的 成员变量 和 成员函数 继承到类 D 中变成了两…

约束综合中的逻辑互斥时钟(Logically Exclusive Clocks)

注:本文翻译自Constraining Logically Exclusive Clocks in Synthesis 逻辑互斥时钟的定义 逻辑互斥时钟是指设计中活跃(activate)但不彼此影响的时钟。常见的情况是,两个时钟作为一个多路选择器的输入,并根据sel信号…

【Linux】程序地址空间

程序地址空间 首先引入地址空间的作用什么是地址空间为什么要有地址空间 首先引入地址空间的作用 1 #include <stdio.h>2 #include <unistd.h>3 #include <stdlib.h>4 int g_val 100;6 int main()7 {8 pid_t id fork();9 if(id 0)10 {11 int cn…

【Megatron-DeepSpeed】张量并行工具代码mpu详解(四):张量并行版Embedding层及交叉熵的实现及测试

相关博客 【Megatron-DeepSpeed】张量并行工具代码mpu详解(四)&#xff1a;张量并行版Embedding层及交叉熵的实现及测试 【Megatron-DeepSpeed】张量并行工具代码mpu详解(三)&#xff1a;张量并行层的实现及测试 【Megatron-DeepSpeed】张量并行工具代码mpu详解(一)&#xff1a…

测试老鸟经验总结,Jmeter性能测试-重要指标与性能结果分析(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Aggregate Report …

【CTF-web】修改请求头(XFF)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/79.html 随意输入后可以看到需要本地管理员登录&#xff0c;得知这是一道需要修改XFF头的题。 XFF即X-Forwarded-For&#xff0c;该请求标头是一个事实上的用于标识通过代理服务器连接到 web 服务器的客户端的…

【Apollo】Apollo-ros版本架构学习与源码分析

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Apollo-ros版本架构学习与源码分析。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&a…

途乐证券-新股行情持续火爆,哪些因素影响首日表现?

全面注册制以来&#xff0c;参加打新的投资者数量全体呈现下降。打新收益下降&#xff0c;破发频出的布景下&#xff0c;投资者打新策略从逢新必打逐步向优选个股改变。 经过很多历史数据&#xff0c;从商场定价、参加者热度以及机构重视度维度揭秘了上市后股价体现优秀的个股具…

时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)

时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测) 目录 时序预测 | Python实现LSTM长短期记忆网络时间序列预测(电力负荷预测)效果一览基本描述模型结构程序设计参考资料效果一览

记录一下关于word存放代码出现的问题

如下图所示&#xff0c;从 Word 中复制代码并粘贴到其他地方&#xff0c;例如文本编辑器或代码编辑器中&#xff0c;有时会出现额外的连字符或破折号。这是因为 Word 使用了特定的字符编码和格式&#xff0c;而这些字符在代码中可能不被支持或解析为特殊字符。   可见有时从…

拓扑布局和建立小型网络

练习 2.6.1&#xff1a;拓扑布局和建立小型网络 地址表 本实验不包括地址表。 拓扑图 学习目标 正确识别网络中使用的电缆物理连接点对点交换网络验证每个网络的基本连通性 简介&#xff1a; 许多网络问题都可以在网络的物理层解决。因此&#xff0c;必须清楚了解网络连接…

13-把矩阵看作是对系统的描述

探索矩阵乘法&#xff1a;更深刻的理解与应用视角 &#x1f9e9;&#x1f50d; 引言 &#x1f4d6; 在我们进一步探讨矩阵乘法之前&#xff0c;让我们从不同的角度来理解什么是矩阵&#xff0c;以及如何将矩阵视为一个系统。我们之前已经介绍了矩阵的基本概念和运算&#xff…

【QT】 QSS样式表设计一文了解

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT界面设计中的QSS样式技术&#xff0c;主要从**、**和**方面展开&#xff0c;希望对各位小伙伴有所帮助&#xff01;学会了QSS样式设计&#xff0c;就可以开动你的审美&#…

Zookeeper集群 + Kafka集群

文章目录 Zookeeper集群 Kafka集群一.Zookeeper 概述1.Zookeeper 定义2.Zookeeper 工作机制2.1 Zookeeper 工作机制图示 3.Zookeeper 特点4.Zookeeper 数据结构5.Zookeeper 应用场景5.1 统一命名服务5.2 统一配置管理5.3 统一集群管理5.4 服务器动态上下线5.5 软负载均衡 6.Zo…

JMeter启动时常见的错误

很多小伙伴在学工具这一块时&#xff0c;安装也是很吃力的一个问题&#xff0c;之前记得有说过怎么安装jmeter这个工具。那么你要启动jmeter的时候&#xff0c;一些粉丝就会碰到如下几个问题。 1.解压下载好的jmeter安装&#xff0c;Windows 平台&#xff0c;双击 jmeter/bin …

35岁职业危机?不存在!体能断崖?不担心

概述 90年&#xff0c;硕士毕业&#xff0c;干了快8年的Java开发工作。现年33岁&#xff0c;再过2年就要35岁。 工作这些年&#xff0c;断断续续也看过不少35岁找不到工作&#xff0c;转行&#xff0c;降薪入职的传闻、案例。 35岁&#xff0c;甚至30岁之后&#xff0c;体能…