用于cpu评测的过滤类在Java VisualVM中工作吗?

用于cpu评测的过滤类在Java VisualVM中工作吗?,java,profiling,profiler,visualvm,jvisualvm,Java,Profiling,Profiler,Visualvm,Jvisualvm,我想过滤Java VisualVm(版本1.7.0 b110325)中cpu分析的类。为此,我尝试在Profiler->Settings->CPU Settings下将“Profile-only-classes”设置到我的测试包中,但没有效果。然后,我试图通过将java.*和sun.*类设置为“不分析类””来摆脱它们,这也没有任何效果 这仅仅是一个bug吗?还是我遗漏了什么?有解决办法吗?我的意思是除了: 为更好的剖析器付费 手动取样(参见) 切换到调用树视图,这是不好的,因为只有Profil

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

这仅仅是一个bug吗?还是我遗漏了什么?有解决办法吗?我的意思是除了:

  • 为更好的剖析器付费
  • 手动取样(参见)
  • 切换到调用树视图,这是不好的,因为只有Profiler视图提供每个方法消耗的CPU百分比
我想这样做主要是为了得到每个方法消耗CPU的正确百分比。为此,我需要消除恼人的度量,例如
sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run()
(大约70%)。许多用户似乎都有这个问题,请参见


好的,既然您的目标是让代码尽可能快地运行,那么让我来建议如何运行。 我不是VisualVM方面的专家,但我可以告诉你什么是有效的。(实际上,只有少数探查器会告诉您需要知道的内容,也就是说,堆栈上的代码行占了墙上时钟时间的一小部分。)

我所关心的唯一测量是总时间的秒表,或者,如果代码有帧速率之类的值,则为每秒帧数。我不需要任何进一步的精度细分,因为当有一种非常直接的方法来定位它时,它充其量只是一个关于什么在浪费时间(通常是完全无关的)的遥远线索

如果你不想这样做,这取决于你,但它被证明是有效的,而且

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

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

我不认识每一个剖析者,但我认识的一个能告诉你这一点的人。 其他人或许能做到这一点。
它们可能更时髦,但当您的目的是最大限度地提高性能时,它们不会比手动方法工作得更快或更好。

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


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

您的目的是让代码尽可能快地运行吗?或者只是为了得到一些百分比,不管它们是什么意思?通常使用的“时间”是非常模糊的。是的,我的主要目标是让代码运行得更快。我还想估算一下代码应该更改多少。所以我想大致了解一下所有热点及其严重性。我认为VisualVm的结果在这方面是可以接受的,尽管使用了墙时间-如果只有很少的sun.*和java.*类不会弄乱所有的统计数据。请注意,在JVM中,可能会发生这样的情况:即使执行得非常频繁,方法也不会出现在堆栈跟踪上。原因是JVM允许进行堆栈跟踪的方式-线程的堆栈跟踪只能在检查点上进行,而JIT可能不会将检查点插入到每个方法中。你真是“随机暂停传播者”,Mike:)谢谢你的回复,如果我没有给你一个描述这种技术的链接,我会把它投得更高。我确实尝试过,但由于递归,调用堆栈相当复杂。纵断面图将其分解为具有运行时百分比的方法,因此热点更容易看到。其次,纵断面图显示了所有热点及其严重性。这很好地概括了需要进行哪些调整以及调整的程度。你同意吗?@DaveBall:这不是热点和测量。是的,调用堆栈很复杂,并且存在递归。即便如此,看看是否可以全部选中并将其复制到编辑器中。然后研究它,看看你是否能回答一个简单的问题“它当时在做什么,为什么要做?”然后再做几次。这会告诉你为什么要花时间,也会告诉你应该专注于什么。不要被递归或复杂堆栈吓倒。您在3个样本中的2个样本上看到的任何代码行平均成本为(2+1)/(3+2)=60%。好的狩猎。@DaveBall:堆栈越深,狩猎就越好。既然你提到了递归,我敢打赌这就是花费时间的原因。根据我的经验,通知失控是性能问题的一个主要原因。(顺便说一句:热点(PC集中的地方)在像您这样的真实代码中几乎从来都不重要。此外,如果您看到一个高包含百分比函数,您将查看它的内部-错误!查找调用它的原因。探查器不会告诉您这一点。堆栈示例会告诉您。)@DaveBall:抱歉继续。(我讨厌“福音传道者”。)你取了一个样本,发现很多复发