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

Dim*_*ims 8 java visualvm real-time

VisualVM用来看看我的应用程序运行缓慢.但它没有显示所有方法,可能没有显示延迟应用程序的所有方法.

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

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

更新1

我通过采样器和猜测发现了慢速方法.这是toString()方法将其从中断开调试日志记录调用,但耗时.

Settings帮助,现在我知道怎么看:它取决于Start profiling from选项.

Bee*_*ope 11

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

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


Rya*_*art 6

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