JProfiler帮助文档

快照


到目前为止,我们只研究了JProfiler GUI从正在被分析的JVM内部运行的分析代理获取数据的实时会话情形。 JProfiler还支持快照,所有分析数据都被写入了快照文件。这种方式在如下几种情景有优势:

  • 你以自动化方式记录分析数据,例如作为测试的一部分,这样情况就不可能与JProfiler GUI连接。
  • 你想比较来自不同分析会话的分析数据或查看旧的记录。
  • 你想与他人共享分析数据。

快照包含所有记录的数据,包括堆快照。为了节省磁盘空间,快照经过压缩,除了为允许直接内存映射必须保持未压缩的堆遍历器数据。

在JProfiler GUI中保存和打开快照。

当你分析实时会话时,可以使用保存快照工具栏按钮创建快照。 JProfiler从远程代理提取所有分析数据,并将其保存到扩展名为".jps"的本地文件中。 你可以在实时会话过程期间保存多个此类快照。这些快照不会自动打开,你可以继续进行分析。

保存的快照会自动添加到 文件->最近的快照菜单,所以你可以方便地打开刚刚保存的快照。 当实时会话仍在运行时打开一个快照,你可以选择终止实时会话或打开另一个JProfiler窗口。

当你使用JProfiler中的快照比较功能时,快照列表由你为当前实时会话保存的所有快照构成。这使得它很容易比较不同的用例。

通常,你可以通过调用主菜单中的会话->打开快照或在文件管理器中双击快照文件打开快照。 JProfiler的IDE集成也支持通过IDE他们自己一般的打开文件操作打开JProfiler快照。 在这种情况下,你将使用IDE的源代码导航,而不是内置的源代码查看器。

当你打开快照时,所有的记录操作都被禁用,只有带有记录数据的视图可用。要查看记录了哪些类型的数据,请将鼠标悬停在状态栏中的记录标签上。

分析短寿命程序

对于实时会话,所有的分析数据都驻留在被分析JVM的进程中,所以当被分析的JVM被终止时,JProfiler中的分析会话也会被关闭。 要想在JVM退出时继续分析,您有两个选项,这两个选项都可以在会话启动对话框中激活。

  • 你可以防止JVM实际退出,只要JProfiler GUI被连接,就可以人为地保持它存活。 当你从IDE中分析一个测试用例,并希望在IDE的测试控制台中看到状态和总时间时,这种方式可能是不可取的。
  • 你可以要求JProfiler在JVM终止时保存一个快照,并立即切换到该快照。 该快照是临时的,将在你关闭会话时被丢弃,除非你首先使用了保存快照操作。

使用触发器保存快照

自动分析会话的最终结果总是一个快照或一系列快照。在触发器中,你可以添加一个"保存快照"操作,将快照保存在运行分析JVM的机器上。 当该触发器在实时会话期间运行时,快照也会保存在远程机器上,并且可能不包含已经传送到JProfiler GUI的部分数据。

用触发器保存快照有两种基本策略:

  • 对于测试用例,在"JVM启动"触发器中开始记录,并添加一个"JVM退出"触发器,在JVM终止时保存快照。
  • 对于特殊情况,如"CPU负载阈值"触发器,或使用"定时器触发器"进行周期性的分析,在记录一些数据后保存快照,中间有一个"休眠"动作。

HPROF堆快照

在生成堆快照会产生太多开销或消耗太多内存的情况下,你可以使用JVM内置提供的HPROF堆快照功能。 因为这个操作不需要分析代理,所以对于分析在生产中运行的JVM内存问题很有用。

通过JProfiler,有三种方式可以获得这种快照:

  • 对于实时会话,JProfiler GUI在主菜单中提供了一个触发HPROF堆转储的操作。

  • JProfiler有一个特殊的"内存溢出异常"触发器,当OutOfMemoryError 被抛出时,会保存一个HPROF快照。 这对应于HotSpot JVM所支持的
    -XX:+HeapDumpOnOutOfMemoryError
    VM参数

  • JDK中的jmap可执行文件 可用于从运行的JVM中提取HPROF堆转储。

    JProfiler包含的命令行工具jpdump ,比jmap更通用。 它可以让你选择一个进程,可以连接到Windows上作为服务运行的进程,对32位/64位混合的JVM没有问题,并且自动编号HPROF快照文件。 使用-help选项执行它,以了解更多信息。

JDK飞行记录器快照

JDK包含JDK飞行记录器(JFR)机制,用于捕获有关方法执行、对象分配和JVM的其他重要子系统的事件,并将其保存为快照。 生产环境可以选择连续使用该技术,以最小化开销,并为故障排除提供数据。 JFR快照可以通过JDK中的jcmd可执行文件,使用以"JFR."开头的命令进行记录和保存。

使用JProfiler,您可以打开JDK飞行记录器快照来分析记录的数据。 打开JFR快照时,JProfiler的视图选择器中只会显示一部分与JFR记录的数据类型相对应的视图。

首先,遥测部分由JProfiler的遥测子集构成,其他遥测在相应的探针视图中显示。只有在记录了堆统计的情况下,"内存"遥测才会被显示。 与默认的JProfiler遥测有一些不同,例如,"记录的吞吐量"显示的是大小而不是对象计数。

调用树和热点视图是可用的,限制是JFR中的"就绪(Runnable)"线程状态不测量时间,但显示采样计数。 其他线程状态如"等待"或"阻塞"仍然测量时间。由于这种矛盾,线程状态选择器中的"所有线程状态"模式不可用。 另外,非就绪线程状态是从线程状态选择器中显示有可配置最小持续时间阈值的事件中计算出来的。这些线程状态的实际总时间可能会大很多。

因为JFR工作在固定的缓冲区,所以长调用堆栈会被截断。截断后的跟踪不适合构建一个可理解的调用树, 所以这些跟踪会显示在一个特别标记的节点下面。 使用

-XX:FlightRecorderOptions=stackdepth=>nnnn<

VM参数,你可以增加JFR中相应缓冲区的大小,使你的应用程序摆脱截断跟踪。

对于内存记录,记录的对象、分配调用树和分配热点视图显示JFR分配分析数据。最重要的区别是该记录使用了分配采样, 但报告的大小是估计的总大小。只有记录的对象才会显示,没有所有对象的统计数据。 如果记录了堆统计,"活动对象"视图将显示完整垃圾回收后仍在堆上的对象的类统计。 "差异"列显示了第一次和最后一次堆统计之间的数字变化情况。如果这些时间与快照记录的起始点和结束点不一致,则会在遥测视图中添加相应的书签。 只有总对象大小超过固定阈值(通常是堆的1%)的类才会被记录。 默认情况下,JFR中禁用了这个功能,因为它会引入大量的开销。

在"Monitor&锁"部分,只会展现Monitor历史和Monitor使用情况统计视图。特别是锁状态历史图是不可用的, 因此线程历史视图中的Monitor工具提示链接到了Monitor使用情况历史视图。

探针显示了类、Socket、文件和异常。只有为JFR配置了相应的数据记录时,才会显示这些探针中的数据。 在探针调用树和热点视图中没有线程状态选择器,探针跟踪器不可用。

当打开非常大的JFR快照时,你可以通过点击文件选择器中的"自定义分析"复选框,并排除分析中不需要的事件类型, 从而加快快照处理速度,减少内存使用。例如,如果你只对CPU数据感兴趣,你可以排除Monitor事件。