奇怪的分析结果:肯定会弹出非瓶颈方法

Posted

技术标签:

【中文标题】奇怪的分析结果:肯定会弹出非瓶颈方法【英文标题】:Strange profiling results: definitely non-bottleneck method pops up 【发布时间】:2010-05-07 12:37:35 【问题描述】:

我正在使用 YourKit 和 JProfiler 中的采样分析和“手动”分析程序(我启动它并按 Ctrl-Break 几次以获取线程转储)。

这三种方法都给了我非常奇怪的结果:在一个 3 行方法中花费了百分之几十的时间,它甚至不进行任何分配或同步,也没有循环等。此外,在我将这个方法变成 NOP 甚至完全删除它的调用之后,可观察到的程序性能根本没有改变(尽管它的内存泄漏可以忽略不计,因为它是一种释放廉价资源的方法)。

我在想这可能是因为 JVM 对线程堆栈跟踪可能被执行的时刻施加了限制,结果不知何故,在我的程序中正是调用此方法的时刻,尽管它或调用它的上下文绝对没有什么特别之处。

这种现象的解释是什么? 上述限制是什么? 我可以采取哪些进一步的措施来澄清这种情况?

【问题讨论】:

也许是分析器结果的快照开始 【参考方案1】:

在我看来,这些结果仅表明此方法被调用了很多次。由于它的代码非常小,并且可以称为调用树叶,因此它对您的分析结果的影响似乎可以忽略不计。不过,我有很多次遇到那种奇怪的结果。

【讨论】:

这个方法被调用的次数不超过它周围的更重的方法;此外,当我将此方法设为无操作时,程序性能并没有明显变化。【参考方案2】:

一些第 3 方库由于意外的使用模式而导致堆转储完全失控,例如,如果使用 cglib,它将掩盖问题的实际原因,而是显示大量代理对象(如果我没记错的话)改为填满虚拟机。

所以简而言之,代码生成和反射可能会导致统计数据出错。

【讨论】:

【参考方案3】:

当您多次执行 Ctrl-Break 并获得线程转储时,我很好奇您看到了什么。在我看来,调用堆栈是最有用的信息。如果您的 3-liner 大部分时间都在堆栈中,那么您可以通过查看调用它的位置以及调用 that 的位置等来了解原因。这些调用站点只是与 3-liner 一样对所花费的时间负责。

如果堆栈跟踪似乎没有意义,可能是因为它们被延迟到某事完成之后。如果是这样,请查找堆栈以查看刚刚完成的内容,因为中断可能发生在其中。

【讨论】:

@jkff:对不起,我读得太快了。我重新编辑了回复。

以上是关于奇怪的分析结果:肯定会弹出非瓶颈方法的主要内容,如果未能解决你的问题,请参考以下文章

navicat+for+mysql如何导入不同数据库的表

JavaScript变量提升及作用域

Python处理session最简单的方法

怎么判断mysql读和写达到了瓶颈

SVN使用方法

SPARK 是怎么清除Shuffle中间结果数据的