繁体   English   中英

用于cpu profiling的过滤类是否适用于Java VisualVM?

[英]Does filtering classes for cpu profiling work in Java VisualVM?

我想在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%)。 很多用户似乎都有这个问题,例如

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

此外,如果您拍摄了性能分析会话的快照,您将能够看到任何热点方法的整个callstack - 这样您就可以从run()方法导航到您自己的应用程序逻辑方法,过滤掉由配置文件新的Runnables选项。

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

我唯一需要考虑的测量是在整个时间内使用一些秒表,或者,如果代码具有帧速率,每秒帧数等等。 我不需要任何进一步的精确分解,因为它是充其量浪费时间(通常完全不相关)的远程线索,当有一种非常直接的方式来定位它时。

如果您不想进行随机暂停 ,那取决于您,但事实证明它可行,并且这是一个43倍加速的示例

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM