JProfiler帮助文档Download

快照


到目前为止,我们只看过实时会话,其中 JProfiler GUI 从正在被分析的 JVM 内运行的分析代理获取数据。JProfiler 还支持快照,其中所有分析数据都写入文件。这在几种情况下是有利的:

  • 您自动记录分析数据,例如,作为测试的一部分,因此无法连接 JProfiler GUI。
  • 您希望比较不同分析会话的数据或查看较早的记录。
  • 您希望与其他人共享分析数据。

快照包括所有记录的数据,包括堆快照。为了节省磁盘空间,快照被压缩,但堆漫游器数据必须保持未压缩以允许直接内存映射。

在 JProfiler GUI 中保存和打开快照

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

保存的快照会自动添加到 File→Recent Snapshots 菜单中,因此您可以方便地打开刚刚保存的快照。当实时会话仍在运行时打开快照时,您可以选择终止实时会话或打开另一个 JProfiler 窗口。

当您在 JProfiler 中使用快照比较功能时,快照列表会填充您为当前实时会话保存的所有快照。这使得比较不同的用例变得容易。

通常,您可以通过从主菜单中调用 Session→Open Snapshot 或在文件管理器中双击快照文件来打开快照。JProfiler 的 IDE 集成还支持通过 IDE 自身的通用 Open File 操作打开 JProfiler 快照。在这种情况下,您将获得进入 IDE 的源代码导航,而不是内置的源代码查看器。

当您打开快照时,所有记录操作都被禁用,并且只有记录了数据的视图可用。要发现记录了哪些数据,请将鼠标悬停在状态栏中的记录标签上。

分析短生命周期程序

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

  • 您可以防止 JVM 实际退出,并在 JProfiler GUI 连接的情况下保持其人为存活。这在您从 IDE 分析测试用例并希望在 IDE 的测试控制台中查看状态和总时间时可能是不希望的。
  • 您可以要求 JProfiler 在 JVM 终止时保存快照并立即切换到它。快照是临时的,除非您首先使用 Save Snapshot 操作,否则将在您关闭会话时被丢弃。

使用触发器保存快照

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

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

  • 对于测试用例,在“JVM 启动”触发器中开始记录,并添加一个“JVM 退出”触发器以在 JVM 终止时保存快照。
  • 对于异常条件,如“CPU 负载阈值”触发器或使用“计时器触发器”进行定期分析,在记录一些数据后保存快照,并在两者之间使用“睡眠”操作。

HPROF 堆快照

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

使用 JProfiler,有三种方法可以获得这样的快照:

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

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

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

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

JDK Flight Recorder 快照

JProfile 完全支持打开由 Java Flight Recorder (JFR) 保存的快照。在这种情况下,UI 显著不同,并根据 JFR 的功能进行了调整。有关更多详细信息,请参阅 JFR 帮助主题