为什么 Java 飞行记录器采集的样本太少?
Why does the Java flight recorder take too few samples?
我们的应用程序性能不佳,因此我们使用飞行记录器的方法分析来查看时间花在了哪里。它基本上可以正常工作,但在一分钟的记录中,所采集的样本数量远低于 100。 (使用“分析”预设)
我使用了一个简单的示例应用程序(汇总随机数)进行比较,它在一分钟或记录中产生了大约 6000 个样本 - 这对我来说似乎是正确的。
首页上有几个警告,如:高内存消耗,loooooots of Exceptions。但该应用程序基本上可以正常工作,所以这可能是一个转移注意力的问题。
我已经通过增加数字解决了“堆栈深度 t运行cated”问题。
我的猜测:要么飞行记录器配置错误,要么时间实际上没有花在代码上,而是花在了其他任务上。 cpu 在 运行 期间非常忙,所以我不认为所有线程都在等待。
请告诉我哪些信息可能很重要,以便我添加它们。
(这是一个用 Scala 编写的 Web 框架库,使用 Jetty 作为 Web 服务器;Oracle JDK 8)
Java Flight Recorder方法采样非常具体。
有两种方法示例
- “方法分析示例”- 仅当线程正在执行 Java 代码(应用程序代码,不是 JNI,不是 JVM 的一部分)时才获取示例
- “方法分析示例本机”- 仅当线程处于 JNI 调用中时才获取示例
这些都是单独拍摄的,只有前者是由任务控制中心可视化的。两种类型的示例都省略了以下执行状态。
- 通过 JVM 内置工具挂起的线程(阻塞、等待、睡眠状态)
- 线程执行 JVM 特定代码,例如引发异常
这些省略的状态导致样本数减少。由于 CPU 饥饿,高 CPU 利用率也可能降低 JFR 的采样频率。
我不建议使用 JFR 方法抽样作为一线性能诊断。具有基于线程转储的采样的可视化 VM 通常会提供更一致的画面。 JFR 是一个强大的工具,但您需要结合来自多种类型事件的信息来构建整体性能图。
“Looots of exceptions”是 Visual VM 倾向于显示热点的情况之一,而 JFR 默默地忽略了示例。
阅读以下有关 JVM 和 Mission Control 用法中采样分析的怪癖的更多信息:
我们的应用程序性能不佳,因此我们使用飞行记录器的方法分析来查看时间花在了哪里。它基本上可以正常工作,但在一分钟的记录中,所采集的样本数量远低于 100。 (使用“分析”预设)
我使用了一个简单的示例应用程序(汇总随机数)进行比较,它在一分钟或记录中产生了大约 6000 个样本 - 这对我来说似乎是正确的。
首页上有几个警告,如:高内存消耗,loooooots of Exceptions。但该应用程序基本上可以正常工作,所以这可能是一个转移注意力的问题。
我已经通过增加数字解决了“堆栈深度 t运行cated”问题。
我的猜测:要么飞行记录器配置错误,要么时间实际上没有花在代码上,而是花在了其他任务上。 cpu 在 运行 期间非常忙,所以我不认为所有线程都在等待。
请告诉我哪些信息可能很重要,以便我添加它们。
(这是一个用 Scala 编写的 Web 框架库,使用 Jetty 作为 Web 服务器;Oracle JDK 8)
Java Flight Recorder方法采样非常具体。 有两种方法示例
- “方法分析示例”- 仅当线程正在执行 Java 代码(应用程序代码,不是 JNI,不是 JVM 的一部分)时才获取示例
- “方法分析示例本机”- 仅当线程处于 JNI 调用中时才获取示例
这些都是单独拍摄的,只有前者是由任务控制中心可视化的。两种类型的示例都省略了以下执行状态。
- 通过 JVM 内置工具挂起的线程(阻塞、等待、睡眠状态)
- 线程执行 JVM 特定代码,例如引发异常
这些省略的状态导致样本数减少。由于 CPU 饥饿,高 CPU 利用率也可能降低 JFR 的采样频率。
我不建议使用 JFR 方法抽样作为一线性能诊断。具有基于线程转储的采样的可视化 VM 通常会提供更一致的画面。 JFR 是一个强大的工具,但您需要结合来自多种类型事件的信息来构建整体性能图。
“Looots of exceptions”是 Visual VM 倾向于显示热点的情况之一,而 JFR 默默地忽略了示例。
阅读以下有关 JVM 和 Mission Control 用法中采样分析的怪癖的更多信息: