6

我想过滤在 Java VisualVm(版本 1.7.0 b110325)中哪些类被 cpu-profiled。为此,我尝试在 Profiler -> Settings -> CPU-Settings 下为我的测试包设置“ Profile only classes ”,但没有效果。然后我尝试通过将所有 java.* 和 sun.* 类设置在“不要配置类”中来摆脱它们,这也没有效果。

这只是一个错误吗?还是我错过了什么?有解决方法吗?我的意思是:

我想这样做主要是为了获得每个方法消耗的 CPU 的一半正确百分比。为此,我需要摆脱烦人的测量,例如sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()(大约 70%)。许多用户似乎有这个问题,见例如

4

2 回答 2

10

您在配置文件中看到的原因sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()是您选择了Profile new Runnables选项。

此外,如果您拍摄分析会话的快照,您将能够看到任何热点方法的整个调用堆栈 - 这样您就可以从方法导航到您自己的应用程序逻辑方法,过滤掉Profile newrun()产生的噪音可运行文件选项。

于 2011-08-27T05:40:50.347 回答
0

好的,既然你的目标是让代码尽可能快地运行,那么让我建议如何去做。我不是 VisualVM 方面的专家,但我可以告诉你什么是有效的。(实际上只有少数分析器会告诉您您需要知道的内容,即 -您的代码的哪些行在堆栈中是挂钟时间的健康部分。)

我唯一关心的测量是总时间的一些秒表,或者,如果代码有类似帧率的东西,每秒的帧数。我不需要任何形式的进一步精确细分,因为当有一种非常直接的方法可以找到它时,它充其量只是一个远程线索,说明什么是在浪费时间(而且通常完全不相关)。

如果你不想做random-pausing,这取决于你,但它被证明是有效的,这里有一个 43x speedup 的例子

基本上,这个想法是你得到一个(小,如 10)数量的堆栈样本,在随机挂钟时间获取。每个样本(显然)由一个呼叫站点列表组成,最后可能还有一个非呼叫站点。(如果样本在 I/O 或睡眠期间,它将在系统调用中结束,这很好。这就是你想知道的。)

如果有一种方法可以加速您的代码(几乎肯定有),您会看到它是一行代码,至少出现在一个堆栈示例中。它出现在任何一个样本上的概率与它使用的时间分数完全相同。 因此,如果有一个调用站点或其他代码行使用了健康的一小部分时间,并且您可以避免执行它,那么总时间将减少该部分。

我不认识每一个分析器,但我知道一个可以告诉你的是Zoom。其他人也许能够做到。它们可能更漂亮,但当您的目的是最大化性能时,它们不会比手动方法更快或更好。

于 2011-08-26T22:58:25.763 回答