为什么VisualVM Profiler中不显示所有方法?

时间:2012-12-24 20:52:02

标签: java real-time visualvm

我正在使用VisualVM查看我的应用程序运行缓慢的位置。但它没有显示所有方法,可能没有显示延迟应用程序的所有方法。

我有一个实时应用程序(声音处理),并且时间不足几百微秒。

VisualVM是否有可能隐藏自己快速的方法?

更新1

我通过采样器和猜测发现了慢速方法。这是toString()方法,它是从调试日志中调用的,它已关闭,但耗费时间。

Settings有所帮助,现在我知道如何看待它:它取决于Start profiling from选项。

3 个答案:

答案 0 :(得分:11)

除了Ryan Stewart提到的过滤器之外,以下是为什么方法可能不会出现在分析器中的其他几个原因:

  • 采样配置文件本质上是随机的:每N ms采用当前所有线程堆栈的样本。实际执行但在运行期间未在任何样本中捕获的某些方法将不会出现。这通常没有太大的问题,因为它们没有出现在任何样本中,这意味着这些方法非常有可能不占用运行时的很大一部分。
  • 在visualvm中使用基于检测的采样(称为“CPU分析”)时,需要定义分析方法的入口点(“从中开始分析”选项)。我发现默认包中的方法失败了,并且在附加分析器时当前运行的方法也不会花费时间(在当前调用的持续时间内 - 它会得到以后的调用。这可能是因为在当前调用完成之前,不会交换已检测的方法。
  • 采样基于堆栈跟踪的分析存在潜在的严重问题,即样本仅在代码中的安全点处进行。当请求跟踪时,每个线程被强制到一个安全点,然后进行堆栈。在某些情况下,您的代码中可能有一个热点,它没有安全点轮询(JIT可以保证在固定次数的迭代后终止的简单循环通用),与一些具有安全点轮询的代码交错。您的堆栈将始终在安全点代码中显示您的进程,从不在安全点免费代码中,即使后者可能占用大部分CPU时间。

答案 1 :(得分:5)

我目前没有在我面前,但在开始分析之前,默认情况下隐藏了一个设置窗格,允许您输入正则表达式以过滤掉方法。默认情况下,它会过滤掉许多核心JDK。

答案 2 :(得分:0)

我的宠物项目也遇到了同样的问题。我添加了一个package名称,此问题已解决。我不明白为什么。 VisualVM 1.4.1jdk1.8.0_181jdk-10.0.2Windows 10