用于cpu评测的过滤类在Java VisualVM中工作吗?
我想过滤Java VisualVm(版本1.7.0 b110325)中cpu分析的类。为此,我尝试在Profiler->Settings->CPU Settings下将“Profile-only-classes”设置到我的测试包中,但没有效果。然后,我试图通过将java.*和sun.*类设置为“不分析类””来摆脱它们,这也没有任何效果 这仅仅是一个bug吗?还是我遗漏了什么?有解决办法吗?我的意思是除了:用于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
- 为更好的剖析器付费
- 手动取样(参见)
- 切换到调用树视图,这是不好的,因为只有Profiler视图提供每个方法消耗的CPU百分比李>
sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run()
(大约70%)。许多用户似乎都有这个问题,请参见
- 李>
它们可能更时髦,但当您的目的是最大限度地提高性能时,它们不会比手动方法工作得更快或更好。您在配置文件中看到
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:抱歉继续。(我讨厌“福音传道者”。)你取了一个样本,发现很多复发