2011-08-26 66 views
6

我想过滤在Java VisualVm(版本1.7.0 b110325)中正在进行cpu配置的类。为此,我尝试在Profiler - > Settings - > CPU-Settings中将“Profile only classes”设置为我的测试包,但没有任何效果。然后,我试图通过将它们设置为“不要剖析类”来尝试摆脱所有java。*和sun。*类,它们也没有效果。在Java VisualVM中过滤用于cpu分析工作的类吗?

这是一个简单的错误?或者我错过了什么?有没有解决方法?我的意思是除了:

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

+0

是你的目的是让尽可能跑得快尽可能的代码?或只是为了得到一些百分比,而不管它们是什么意思?常用的“时间”非常含糊。 –

+0

是的,我的主要目标是让代码更快运行。我也想估计一下代码应该改变多少。所以我想对所有热点及其严重程度进行粗略概述。我认为VisualVm的结果是可以接受的,尽管使用了时间间隔 - 如果只有那些少数sun和java。*类不会搞乱所有的统计数据。 – DaveFar

回答

10

您在配置文件中看到sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()的原因是您已离开选项配置文件新选择了Runnables。此外,如果您拍摄了分析会话的快照,则可以看到整个调用堆栈的任何热点方法 - 这样,您可以从run()方法导航到您自己的应用程序逻辑方法,筛选出噪音生成的配置文件新的Runnables选项。

+0

谢谢JB(+5),我将在星期一检查这个选项 - 听起来像解决方案:)我拍了一张快照,这给了我Call Tree视图,这是不好的,因为只有Profiler视图给我百分比每种方法消耗的CPU。由于递归,我的调用堆太复杂,无法从中获取明智的性能信息。 – DaveFar

+0

谢谢JB,禁用了“Profile new Runnables”这个选项。 – DaveFar

+2

请注意禁用上述选项的后果。打开该选项后,您将自动获得有关所有新启动的线程/可运行的信息。关闭该选项后,您必须确保提供完整的根方法列表。 –

0

好的,因为你的目标是让代码尽可能快地运行,所以让我建议如何去做。 我不是VisualVM的专家,但我可以告诉你什么可行。 (只有少数剖析实际上告诉你,你需要知道什么,这是 - 你的代码的行是在堆栈上的挂钟时间健康的一部分。)

我曾经有是麻烦的唯一测量一些秒表的总体时间,或者,如果代码有像帧速率,每秒的帧数。我不需要任何进一步的精确分解,因为当有一种非常直接的方法来定位它时,它至多是一个遥远的线索,意味着什么是浪费时间(更常常是完全不相关的)。

如果你不想做random-pausing,这取决于你,但它已被证明工作,并且here's an example of a 43x speedup

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

如果有一种方法来加快你的代码(和几乎可以肯定是),你会将它看作至少出现在一个堆栈样本上的一行代码。 它在任何一个样本上出现的概率与其使用的时间分数完全相同。 因此,如果有一个使用健康时间的呼叫站点或其他代码行,并且您可以避免执行它,则总体时间将减少该部分。

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

+0

请注意,在JVM中,即使执行的频率很高,也可能发生方法不会出现在堆栈跟踪中。其原因在于JVM允许采用堆栈跟踪的方式 - 线程的堆栈跟踪只能在检查点采用,而JIT可能不会将其插入到每个单一方法中。 –

+0

你很“随机暂停布道者”,迈克:)感谢反正您的答复,我会upvoted它,如果我没有给一个链接到你描述这种技术了。我尝试过,但由于递归,callstack非常复杂。配置文件视图将其分解为具有运行时百分比的方法,因此热点更易于查看。其次,配置文件视图显示所有热点及其严重程度。这给出了一个很好的概览,说明了需要做些什么和需要多少调整。你同意吗? – DaveFar

+0

@DaveBall:这不是关于热点和测量。是的,调用堆栈很复杂,并且有递归。即便如此,看看你是否可以选择全部并将其复制到编辑器中。然后研究它,看看你能否回答这样一个简单的问题:“当时在做什么,它为什么这样做?”然后再做几次。这会告诉你为什么花时间,它会告诉你你应该专注于什么。不要被递归或复杂的堆栈所吓倒。您在3个样本中的2个样本中看到的任何代码行的平均成本为(2 + 1)/(3 + 2)= 60%。好狩猎。 –