Java 为什么不';VisualVM profiler中是否显示所有方法?

Java 为什么不';VisualVM profiler中是否显示所有方法?,java,real-time,visualvm,Java,Real Time,Visualvm,我正在使用VisualVM查看我的应用程序速度慢的地方。但是它并没有显示所有的方法,可能也没有显示所有延迟应用程序的方法 我有一个实时应用程序(声音处理),时间不足几百微秒 有没有可能VisualVM隐藏了本身很快的方法 更新1 我通过取样器和猜测找到了一种缓慢的方法。它是从调试日志中调用的toString()方法,调试日志已关闭,但需要花费一段时间 Settings帮助了我,现在我知道了如何查看它:它取决于从选项开始评测。我现在没有它,但在开始评测之前,有一个默认隐藏的设置窗格,允许您输入正则

我正在使用
VisualVM
查看我的应用程序速度慢的地方。但是它并没有显示所有的方法,可能也没有显示所有延迟应用程序的方法

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

有没有可能
VisualVM
隐藏了本身很快的方法

更新1

我通过取样器和猜测找到了一种缓慢的方法。它是从调试日志中调用的
toString()
方法,调试日志已关闭,但需要花费一段时间


Settings
帮助了我,现在我知道了如何查看它:它取决于
选项开始评测。

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

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

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

    • 我的宠物项目也遇到了同样的问题。我添加了一个
      包名,问题就解决了。我不明白为什么。
      VisualVM 1.4.1
      jdk1.8.0_181
      jdk-10.0.2
      Windows 10
      Windows 10
      是否在使用取样器或分析器?取样器,井样本,在规定的时间间隔内。profiler更准确,但速度要慢得多。调试日志记录都应该用
      if(log.isDebugEnabled())包围{
      或类似,以避免字符串连接和日志调用中发生的其他事情。另请参阅和,以获取有关分析以及如何设置分析根和检测筛选器的更多信息。默认情况下,可数循环没有安全点以保持其快速性。请参阅此错误示例:添加一个标志以将其转换为havior关闭(但默认为打开)。您也可以尝试回答阅读您的答案后得出的答案。