java - 为什么 VisualVM 探查器中没有显示所有方法?

标签 java real-time visualvm

我正在使用 VisualVM 查看我的应用程序哪里慢了。但是它并没有显示所有的方法,很可能没有显示所有延迟应用程序的方法。

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

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

更新 1

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

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

最佳答案

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

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

关于java - 为什么 VisualVM 探查器中没有显示所有方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025602/

相关文章:

database - 针对不断变化的大型数据集发出实时警报

multithreading - clojure reduce 函数使用所有内核,即使它看起来是单线程的

java - 垃圾收集器不会自行释放内存

java - 通过 wildfly maven 插件重启 jboss 的命令行参数是什么?

java - 在多个层次依赖关系中模拟对象时是否有难闻的气味?

python - 如何退出 matplotlib 并在之后继续代码

datetime - 处理亚秒精度 UTC 时间算术中的闰秒

java - 如何以编程方式连接到无线网络?

java - 我的 SQL 语法错误

java - 以表格形式显示表格 mbean 属性