我在用VisualVM
看看我的应用程序在哪里慢。但它并没有显示所有方法,可能没有显示所有延迟应用程序的方法。
我有一个实时应用程序(声音处理),并且有几百微秒的时间不足。
有没有可能VisualVM
隐藏本身速度很快的方法?
UPDATE 1
我通过采样器和猜测找到了缓慢的方法。它是toString()
从已关闭的调试日志记录中调用的方法,但会消耗时间。
Settings
有帮助,现在我知道如何看待它:这取决于Start profiling from
option.
除了 Ryan Stewart 提到的过滤器之外,以下是方法可能不会出现在探查器中的几个其他原因:
- 采样配置文件本质上是随机:每 N 毫秒对所有线程的当前堆栈进行一次采样。一些实际执行但在运行期间未在任何样本中捕获的方法不会出现。这通常不会有太大问题,因为它们没有出现在任何示例中,这意味着这些方法很有可能不会占用您的大部分运行时间。
- 在 VisualVM 中使用基于检测的采样(称为“CPU 分析”)时,您需要定义分析方法的入口点(“开始分析”选项)。我发现这对于默认包中的方法失败,并且在附加探查器时也不会在当前运行的方法中获取时间(在当前调用的持续时间内 - 它将获得稍后的调用)。这可能是因为在当前调用完成之前,检测的方法不会被交换。
- 基于堆栈跟踪的分析可能会导致采样面临一个潜在的严重问题,即仅在代码中的安全点进行采样。当请求跟踪时,每个线程都被强制到安全点,然后获取堆栈。在某些情况下,您的代码中可能有一个热点,它不进行安全点轮询(对于简单循环来说很常见,JIT 可以保证在固定次数的迭代后终止),并与一些具有安全点轮询的代码交错。您的堆栈将始终在安全点代码中显示您的进程,而不会在安全点空闲代码中显示您的进程,即使后者可能占用了大部分 CPU 时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)