到目前为止,我们只关注了实时会话,在这些会话中,JProfiler GUI 从正在被分析 (profiled) 的 JVM 内部运行的分析代理获取数据。JProfiler 还支持快照 (snapshots),所有分析数据会被写入文件。在多种场景下,这样做具有优势:
- 你可以自动记录分析数据,例如,作为测试的一部分,这样就无法通过 JProfiler GUI 进行连接。
- 你希望比较不同分析会话的分析数据,或查看较早的记录。
- 你希望与他人共享分析数据。
快照 (snapshots) 包含所有记录的数据,包括堆快照 (heap snapshots)。为了节省磁盘空间,快照会被压缩,除了堆遍历器 (heap walker) 数据必须保持未压缩,以便直接进行内存映射。
在 JProfiler GUI 中保存和打开快照 (snapshots)
当你正在分析实时会话时,可以通过工具栏按钮 保存快照 (Save Snapshot) 创建快照。JProfiler 会从远程代理拉取所有分析数据,并将其保存为本地文件,扩展名为“.jps”。在一次实时会话中,你可以保存多个这样的快照。它们不会被自动打开,你可以继续进行分析。
已保存的快照会自动添加到 文件 (File)→最近快照 (Recent Snapshots) 菜单中,因此你可以方便地打开刚刚保存的快照。当实时会话仍在运行时打开快照,你可以选择终止实时会话或在另一个 JProfiler 窗口中打开。
当你在 JProfiler 中使用快照比较功能时,快照列表会包含当前实时会话中你保存的所有快照。这使得比较不同用例变得非常容易。
通常,你可以通过主菜单 会话 (Session)→打开快照 (Open Snapshot) 打开快照,或者在文件管理器中双击快照文件。JProfiler 的 IDE 集成也支持通过 IDE 本身的通用 打开文件 (Open File) 操作打开 JProfiler 快照。在这种情况下,你会在 IDE 中进行源码导航,而不是使用内置源码查看器。
当你打开快照时,所有记录操作都会被禁用,并且只有包含已记录数据的视图 (views) 可用。要查看已记录了哪些类型的数据,将鼠标悬停在状态栏中的记录标签上即可。
分析短生命周期程序
对于实时会话,所有分析数据都保存在被分析 (profiled) JVM 的进程中。因此,当被分析 JVM 终止时,JProfiler 中的分析会话也会关闭。若要在 JVM 退出后继续分析,你有两种选择,这两种方式都可以在会话启动对话框中激活。
- 你可以阻止 JVM 实际退出,只要 JProfiler GUI 仍然连接,就让其保持“假死”状态。当你在 IDE 中分析测试用例并希望在 IDE 的测试控制台中查看状态和总耗时时,这种方式可能并不理想。
- 你可以让 JProfiler 在 JVM 终止时保存一个快照,并立即切换到该快照。该快照是临时的,除非你先使用 保存快照 (Save Snapshot) 操作,否则在关闭会话时会被丢弃。
通过触发器 (triggers) 保存快照
自动化分析会话的最终结果总是一个或一系列快照 (snapshots)。在触发器 (triggers) 中,你可以添加“保存快照 (Save a snapshot)”操作,将快照保存到被分析 (profiled) JVM 所在的机器上。当触发器在实时会话中运行时,快照也会被保存到远程 (remote) 机器上,并且可能不包含已经传输到 JProfiler GUI 的部分数据。
使用触发器保存快照有两种基本策略:
- 对于测试用例,在“JVM 启动 (JVM startup)”触发器中开始记录,并在“JVM 退出 (JVM exit)”触发器中保存快照,当 JVM 终止时保存快照。
- 对于如“CPU 负载阈值 (CPU load threshold)”触发器等异常情况,或使用“定时器触发器 (Timer trigger)”进行周期性分析时,在中间用“休眠 (Sleep)”操作记录部分数据后保存快照。
HPROF 堆快照 (heap snapshots)
在某些情况下,获取堆快照会带来过多开销或消耗过多内存,你可以使用 JVM 提供的 HPROF 堆快照 (heap snapshots) 这一内置功能。由于此操作不需要分析代理 (profiling agent),因此对于分析生产环境中运行的 JVM 的内存问题非常有用。
使用 JProfiler,可以通过三种方式获取此类快照:
- 对于实时会话,JProfiler GUI 在主菜单中提供了触发 HPROF 堆转储 (heap dump) 的操作。
-
JProfiler 提供了一个特殊的“内存溢出异常 (Out of memory exception)”触发器,在抛出
OutOfMemoryError时保存 HPROF 快照。这对应于 HotSpot JVM 支持的 VM 参数 (VM parameter)-XX:+HeapDumpOnOutOfMemoryError
。 -
JDK 中的 jmap 可执行文件 (jmap executable in the JDK) 可用于从正在运行的 JVM 中提取 HPROF 堆转储。
JProfiler 包含命令行工具
jpdump,它比 jmap 更加灵活。它允许你选择进程,可以连接到以服务方式运行的 Windows 进程,不会遇到 32 位/64 位 JVM 混合的问题,并且会自动编号 HPROF 快照文件。使用-help选项运行以获取更多信息。
JDK Flight Recorder 快照 (snapshots)
JProfiler 完全支持打开由 Java Flight Recorder (JFR) 保存的快照。此时的 UI 明显不同,并针对 JFR 的能力进行了调整。详情请参见 JFR 帮助主题。















