分析器的主要目的是记录来自各种源的运行时数据,这对解决常见问题很有用。此任务的主要问题是正在运行的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
包含参数nowait
和config
参数的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秒钟,并将快照保存到磁盘。