JProfiler帮助文档

自动调优与忽略方法

如果方法调用(method call)记录类型设置为插桩(instrumentation),所有被分析(profiled)类的方法都会被插桩。 这会对执行时间非常短的方法带来显著的性能开销。如果这些方法被高频调用,其测量到的耗时将会远高于实际值。 此外,由于插桩,热点(hot spot)编译器可能无法对这些方法进行优化。在极端情况下,这些方法会成为主导的热点(hot spot), 尽管在未插桩运行(uninstrumented run)时并非如此。比如,XML 解析器中读取下一个字符的方法就是一个例子。 这种方法返回非常快,但可能在很短时间内被调用数百万次。

当方法调用(method call)记录类型设置为采样(sampling)时,不会出现上述问题。 但是,采样不会提供调用次数,只会显示较长的方法调用(method call),并且部分视图(view)在采样模式下无法提供完整功能。

为了缓解插桩带来的问题,JProfiler 提供了一种称为自动调优(auto-tuning)的机制。 分析(profiling)代理会定期检查具有高插桩开销的方法,并将这些方法传递给 JProfiler GUI。 在状态栏中,会显示一条提示,提醒存在高开销的热点(hot spot)。

你可以点击该状态栏条目,查看检测到的高开销热点(hot spot),并选择将其加入忽略方法列表。 这些被忽略的方法将不会被插桩。当会话(session)结束时,也会弹出相同的对话框。

应用新的配置文件设置(profiling setting)后,所有被忽略的方法将在调用树(call tree)中消失。 它们的执行时间会被加到调用方法的自耗时(self-time)上。如果之后你发现某些被忽略的方法在分析视图(view)中不可或缺, 可以在会话(session)设置的 Ignored Methods 选项卡中将其移除。

忽略方法的默认配置包含了用于动态方法分派的 Groovy 调用点(call-site)类,但这些类会让实际调用链难以追踪。

如果你想手动添加忽略方法,可以在会话(session)设置中进行,但更简单的方法是在调用树(call tree)中选择一个方法, 然后通过右键菜单执行 Ignore Method 操作。

在过滤器设置中,你也可以通过将过滤器条目的类型设置为“Ignored”,来忽略整个类或包。 Add Filter From Selection 菜单包含了依赖于所选节点(node)的操作, 并建议忽略该类或逐级包直到顶级包。根据所选节点是 compact-profiled 还是被分析(profiled), 你还会看到切换过滤器为相反类型的操作。

如果你不希望看到任何关于自动调优(auto-tuning)的消息,可以在配置文件设置(profiling setting)中禁用该功能。 同时,你也可以配置判定高开销热点(hot spot)的标准。方法被认为是高开销热点(hot spot),需同时满足以下两个条件:

  • 所有调用的总耗时超过线程总耗时的千分比阈值
  • 平均耗时低于以微秒为单位的绝对阈值