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

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

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

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

更新1

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

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

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

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

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

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