分析器的主要目的是记录来自各种源的运行时数据,这对解决常见问题很有用。此任务的主要问题是正在运行的JVM以极高的速率生成此类数据。如果探查器始终记录所有类型的数据,则会产生不可接受的开销或快速耗尽所有可用内存。此外,您经常希望记录特定用例的数据,而不是看到任何不相关的活动。

这就是为什么JProfiler提供了细粒度的机制来控制您真正感兴趣的信息记录。

标量值和遥测

从分析器的角度来看,最不成问题的数据形式是标量值,例如活动线程数或打开JDBC连接数。JProfiler可以用固定的宏观频率(通常每秒一次)对这些值进行采样,并向您展示随时间的演变。在JProfiler中,显示此类数据的视图称为遥测。由于测量开销和内存消耗很小,因此大多数遥测都会被记录下来。如果长时间记录数据,则会合并较旧的数据点,以便内存消耗不会随时间线性增长。

还有参数化遥测,例如每个类的实例数。额外的维度使永久的时间顺序记录不可持续。您可以告诉JProfiler记录多个选定类的实例计数的遥测,但不记录每个类的实例计数。

要继续前面的示例,JProfiler能够显示所有类的实例计数,但没有按时间顺序排列的信息。这是“所有对象”视图,它将每个类显示为表中的一行。更新视图的频率低于每秒​​一次,并且可以根据测量引起的开销自动调整。确定所有类的实例计数相对昂贵,并且堆上的对象越多,所需的时间就越长。JProfiler限制“所有对象”视图的更新频率,以便在极端情况下测量的开销不会超过10%。您可以冻结视图以暂时停止录制。此外,如果视图未激活,

一些测量捕获类似枚举的值,例如线程当前所处的执行状态。这种测量可以显示为彩色时间线,并且比数字遥测消耗更少的内存。在线程状态的情况下,“线程历史记录”视图显示JVM中所有线程的时间线。就像具有数值的遥测数据一样,旧的值被合并并变得更粗粒度以减少内存消耗。

分配录音

如果您对在特定时间间隔内分配的实例计数感兴趣,则JProfiler必须跟踪所有分配。与“所有对象”视图相反,JProfiler可以迭代堆中的所有对象以获取按需信息,跟踪单个分配要求必须为每个对象分配执行其他代码。这使得它成为一种非常昂贵的测量,可以显着改变配置应用程序的运行时特性,例如性能热点,特别是如果您分配了许多对象。这就是必须明确启动和停止分配记录的原因。

具有关联记录的视图最初显示带有录制按钮的空白页面。工具栏中也可以找到相同的录制按钮。

分配记录不仅记录分配的实例数,还记录分配堆栈跟踪。在内存中保留每个已分配记录的堆栈跟踪会产生过多的开销,因此JProfiler会将记录的堆栈跟踪累积到树中。这也有一个优点,您可以更轻松地解释数据。但是,按时间顺序丢失,无法从数据中提取某些时间范围。

记忆分析

分配记录只能测量对象的分配位置,并且没有关于对象之间引用的信息。需要引用的任何内存分析(例如解决内存泄漏)都是在堆walker中完成的。堆walker获取整个堆的快照并对其进行分析。这是一种侵入性操作,可能会暂停JVM - 可能需要很长时间 - 并且需要大量内存。

更轻量级的操作是在启动用例之前标记堆上的所有对象,以便在以后获取堆快照时可以找到所有新分配的对象。

JVM具有一个特殊的触发器,用于将整个堆转储到以旧HPROF概要分析代理命名的文件中。这与分析界面无关,并且不在其约束下运行。因此,HPROF堆转储速度更快,使用的资源更少。缺点是在查看堆walker中的堆快照时,您将无法与JVM建立实时连接,并且某些功能不可用。

方法通话录音

测量方法调用的时间长度是可选记录,就像分配记录一样。方法调用被累积到树中,并且存在各种视图,其显示来自不同视角的记录数据,例如调用图。此类数据的记录在JProfiler中称为“CPU记录”。

在特定情况下,查看方法调用的时间顺序可能很有用,尤其是涉及多个线程时。对于这些特殊情况,JProfiler提供“呼叫跟踪器”视图。该视图具有单独的记录类型,与更一般的CPU记录无关。请注意,调用跟踪器会产生太多数据,无法解决性能问题,它仅适用于特殊形式的调试。

另一种分析方法调用的视图是“方法统计”视图。它引入了另一个测量轴,并记录了每种方法的执行时间直方图。除非您有兴趣调查某些方法的执行时间是否存在异常值,否则您不需要此数据,并且其记录会产生不可接受的开销。因此,您需要在关联视图中打开方法统计信息的单独记录。

呼叫跟踪器和方法统计信息都依赖于CPU记录,并在必要时自动打开它。

另一种具有自己记录的专业视图是“复杂性分析”。它仅测量所选方法的执行时间,不需要启用CPU记录。其附加数据轴是可以使用脚本计算的方法调用的算法复杂度的数值。通过这种方式,您可以测量方法的执行时间如何取决于其参数。

监控录音

要分析线程等待或阻塞的原因,必须记录相应的事件。这类事件的发生率差异很大。对于线程经常协调任务或共享公共资源的多线程程序,可能存在大量此类事件。这就是默认情况下不记录此类时间顺序数据的原因。

当您打开监视器录制时,“锁定历史记录图表”和“监视历史记录”视图将开始显示数据。

为消除噪音并减少内存消耗,不会记录非常短的事件。视图设置使您可以调整这些阈值。

探测录音

探针显示JVM中的更高级子系统,例如JDBC调用或文件操作。默认情况下,不记录探针,您可以为每个探针单独切换记录。有些探针会增加很少或没有开销,有些会产生大量数据,具体取决于您的应用程序正在做什么以及如何配置探针。

就像分配记录和方法呼叫记录一样,探测数据被累积,并且除时间线和遥测之外,时间信息被丢弃。但是,大多数探测器还具有“事件”视图,允许您检查单个事件。这增加了可能很大的开销,并且具有单独的记录操作。记录操作的状态是持久的,因此当您切换探测记录时,如果您之前已将其打开,则也会切换相关的事件记录。

JDBC探针具有记录JDBC连接泄漏的第三个记录操作。只有在您实际尝试调查此类问题时,才会发生查找连接泄漏的相关开销。就像事件记录动作一样,泄漏记录动作的选择状态是持久的。

录制配置文件

在许多情况下,您只需单击即可开始或停止各种录制。访问所有相应的视图并逐个切换录制按钮是不切实际的。这就是JProfiler有录音配置文件的原因。单击工具栏中的“ 开始录制”按钮可以创建录制配置文件 。

录制配置文件定义了可以原子激活的一种特定记录组合。JProfiler试图给你一个关于你选择的录音创建的开销的粗略印象,并试图阻止有问题的组合。特别是,分配记录和CPU记录不能很好地结合在一起,因为CPU数据的定时将因分配记录而严重失真。

您可以在会话运行时随时激活录制配置文件。录制配置文件不是附加的,它们会停止录制配置文件中未包含的所有录制内容。使用“ 停止录制”按钮可以停止所有录制,无论它们如何被激活。要检查当前活动的录像,请将鼠标悬停在状态栏中的录像标签上。

开始分析时,也可以直接激活录制配置文件。“会话启动”对话框具有“ 初始录制配置文件”下拉列表。默认情况下,未选择任何录制配置文件,但如果需要JVM启动阶段的数据,则可以使用此配置所需录制的位置。

使用触发器录制

有时您希望在特定情况发生时开始录制。JProfiler有一个 系统,用于定义执行操作列表的触发器。可用的触发操作还包括对活动记录的更改。

例如,您可能只想在执行特定方法时启动录制。在这种情况下,您将转到会话设置对话框,激活“ 触发器设置”选项卡并为该方法定义方法触发器。对于操作配置,您可以使用许多不同的记录操作。

“开始录制”动作控制那些没有任何参数的录制。通常,当您停止并重新开始录制时,将清除所有先前录制的数据。对于“CPU数据”和“分配数据”记录,您还可以选择保留以前的数据并继续累积多个间隔。

通过使用上下文菜单中的“添加方法触发器”操作,可以在调用树中方便地添加方法触发器。如果在同一会话中已有方法触发器,则可以选择将方法拦截添加到现有触发器。

默认情况下,启动JVM进行性能分析时,触发器处于活动状态。启动时有两种方法可以禁用触发器:您可以在触发器配置中单独禁用它们,也可以在会话启动对话框中取消选中 启动时启用触发器复选框。在实时会话期间,您可以通过从菜单中选择性能分析 - >(启用|禁用)触发器或单击 状态栏中的触发器记录状态图标来启用或禁用所有触发器。

有时,您需要同时为触发组切换触发器激活。这可以通过为感兴趣的触发器分配相同的组ID并从菜单调用 Profiling-> Enable Triggers Groups来实现。

使用jpcontroller录制

JProfiler有一个命令行可执行文件,用于控制已经分析的任何JVM中的记录。jpcontroller要求发布JProfiler MBean,否则它将无法连接到已配置的JVM。仅当分析代理已经收到分析设置时才会出现这种情况。如果没有分析设置,代理将无法准确记录要记录的内容。

必须满足以下条件之一:

  • 您已使用JProfiler GUI连接到JVM
  • 配置文件JVM是使用-agentpath包含参数nowaitconfig参数的VM参数 启动的。在集成向导中,这对应于Config同步步骤中的Startup立即模式和启动时应用配置选项。
  • JVM准备用于使用jpenable可执行文件进行分析,并-offline指定了 参数。有关jpenable -help 更多信息,请参阅输出。

具体而言,jpcontroller如果仅使用nowait标志启动已配置的JVM ,则无效 。在集成向导中,在Config同步步骤中使用JProfiler GUI选项连接时应用配置将配置此类参数。

jpcontroller为您提供所有录音及其参数的循环多级菜单。您还可以使用它保存快照。

以编程方式开始录制

另一种开始录制的方式是通过API。在配置文件VM中,您可以调用 com.jprofiler.api.controller.Controller该类以编程方式启动和停止录制。有关更多信息以及如何获取包含控制器类的工件,请参阅有关脱机分析的章节。

如果要在不同的JVM中控制记录,可以在配置的JVM中访问同样的MBean jpcontroller。设置MBean的程序化用法在某种程度上涉及并需要相当多的仪式,因此JProfiler附带了一个可以重用的示例。检查文件api/samples/mbean/src/MBeanProgrammaticAccessExample.java。它在另一个配置文件JVM中记录CPU数据5秒钟,并将快照保存到磁盘。

官方:http://resources.ej-technologies.com/jprofiler/help/doc/

参考:https://www.douban.com/note/568711292/

【JProfiler帮助5】记录数据相关推荐

  1. SAP RETAIL MM42维护商品采购信息记录数据的缺陷

    SAP RETAIL MM42维护商品采购信息记录数据的缺陷 如下图商品主数据的采购试图里,维护了采购价格, 采购价格是12 CNY. 我试图使用MM42去将这个价格修改成10 CNY, 却发现无法在 ...

  2. 如何记录数据表信息的变更

    在操作数据记录时,对重要的数据,我们需要记录每一次的变更,有没有好的方法呢? 在通用权限管理系统中提供了记录数据表信息变更的方法. 一.先看看效果截图 二.再看看修改记录表的表结构 三.对该表访问的业 ...

  3. Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略

    Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...

  4. CSDN:借助工具对【本博客访问来源】进行数据图表可视化(网友主要来自美国、新加坡、日本、英德加澳等)——记录数据来源截止日期20200718晚上22点

    CSDN:借助工具对[本博客访问来源]进行数据图表可视化(网友主要来自美国.新加坡.日本.英德加澳等) 目录 粉丝增量 记录数据来源截止日期20201210晚上24点 记录数据来源截止日期202007 ...

  5. java的时间变化_通过java记录数据持续变化时间代码解析

    这篇文章主要介绍了通过java记录数据持续变化时间代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.需求:获取count为null和不为n ...

  6. mysql创建数据库时候同时创建表空间_mysql::创建多个表空间添加记录数据会添加到哪个表空间中?...

    问题:创建多个表空间添加记录数据会添加到哪个表空间中 答:后一个 drwx------ 2 mysql mysql 4.0K Apr 26 08:04 demo -rw-rw---- 1 mysql ...

  7. 上拉加载更多后台数据_6-7【微信小程序全栈开发课程】记录页面(七)--分页加载记录数据...

    现在是一次性加载所有的记录数据,数据多的时候,会加载比较慢,所以我们改成分页加载,一次最多加载15条数据 每次拉倒底部都会自动加载下一页的数据,知道所有的数据加载完成 1.添加data变量 编辑rec ...

  8. Python通过snmp获取交换机VLAN号、VLAN默认网关、VLAN子网掩码和ARP表中的IP地址与MAC对应记录数据

    自己做项目时,自己封装的Python通过snmp获取交换机VLAN号.VLAN默认网关.VLAN子网掩码和ARP表中的IP地址与MAC对应记录数据. myPySnmp.py源代码 "&quo ...

  9. 修改数据_如何批量修改数据库中的特定记录数据

    大家好,今日我们继续VBA数据库解决方案的第30讲:如何批量修改数据库中的特定记记录数据.在上一讲中,我们讲了批量编辑数据的方案,用到的是UPDATE方法,今日我们仍用此方法解决删除特定记录.这些记录 ...

最新文章

  1. 使用ExpandableListView以及如何优化view的显示减少内存占用
  2. lucene集成IK实现中文分词检索
  3. bzoj 3687: 简单题
  4. MATLAB可视化实战系列(二十八)-贪心算法求快速平方根倒数算法中的“魔术数字”【含matlab源代码】
  5. Ubuntu 16.04安装Nginx
  6. python 闭包(closure)
  7. 计算机动漫游戏制作 巴中,四川省哪些中专学校有计算机动漫与游戏制作专业...
  8. 【Android OpenGL ES 开发 (五)】纹理相关(二)
  9. 利用反射获得类的public static/const成员的值
  10. 文件和异常 Python
  11. url传参(中文乱码)值得注意的地方
  12. PyTorch中的梯度微分机制
  13. linkedin 分享_如何将WordPress帖子自动发布到LinkedIn
  14. Windows下卸载pip的方法
  15. 201671030109 词频统计软件项目报告
  16. 【PTA-python】第5章-1 输出星期名缩写 (70 分)
  17. 手机浏览器自动打开快应用?
  18. SDUTOJ4384_一方通行与最后之作(18级期末上机考试二)
  19. VMware14配置虚拟网络详解
  20. 嵌入式存储设备学习笔记

热门文章

  1. linux shell 脚本 入门到实战详解
  2. 765. 情侣牵手 查并集
  3. “Authorization“, “Bearer “
  4. 易语言添加ctrl c键,易语言怎样设置监视的热键为ctrl+1键?
  5. 今天元宵节啦,给大家用Python送上祝福
  6. android客户端控制树莓派GPIO点亮LED灯
  7. 【阿尼亚喜欢BigData】“红亚杯”大数据环境搭建与数据采集技能线上专题赛——满分解析②
  8. C#之清空FileStream内容
  9. 麒麟820和980哪个好-麒麟820和980差距有多大
  10. vue组件之间的传值(兄弟间的传值)