我想在Java VisualVm(版本1.7.0 b110325)中过滤哪些类是cpu-profiled。为此,我尝试使用Profiler - >设置 - >要设置的CPU设置" 仅配置文件类"到我的测试包,没有效果。然后我试图摆脱所有java。*和sun。*类,将它们设置在" 不分析类",它们也没有效果。
这只是一个错误吗?或者我错过了什么?有解决方法吗?我的意思是:
我想这样做主要是为了获得每个方法消耗的CPU的正确百分比。为此,我需要摆脱烦人的测量,例如为sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()
(约70%)。许多用户似乎遇到此问题,请参阅例如
答案 0 :(得分:10)
您在配置文件中看到sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()
的原因是您选择了配置新的Runnables 选项。
此外,如果您拍摄了性能分析会话的快照,您将能够看到任何热点方法的整个callstack - 这样您就可以从run()
方法导航到您自己的应用程序逻辑方法,过滤消除配置文件新Runnables 选项产生的噪音。
答案 1 :(得分:0)
好的,既然你的目标是尽可能快地运行代码,那么让我建议如何做。 我不是VisualVM的专家,但我可以告诉你什么有用。 (只有少数的分析器实际上告诉你你需要知道什么,这是 - 你的代码的哪一行在堆栈中是挂钟时间的健康部分。)
我唯一需要考虑的测量是在整个时间内使用一些秒表,或者,如果代码具有帧速率,即每秒的帧数。我不需要任何进一步的精确分解,因为它是充其量浪费时间(通常完全不相关)的远程线索,当有一种非常直接的方式来定位它时。
如果您不想random-pausing,那取决于您,但事实证明它可行,here's an example of a 43x speedup。
基本上,这个想法是你得到一个(小的,像10个)堆栈样本,在随机的挂钟时间。 每个样本(显然)包含一个呼叫站点列表,最后可能是一个非呼叫站点。 (如果样本在I / O或睡眠期间,它将在系统调用中结束,这很好。这就是你想知道的。)
如果有办法加速你的代码(几乎可以肯定),你会看到它至少出现在一个堆栈样本上的一行代码。 它在任何一个样本上出现的概率与它使用的时间部分完全相同。 因此,如果有一个使用健康时间的呼叫站点或其他代码行,并且您可以避免执行它,那么总时间将减少该分数。
我不知道每个探查者,但我知道可以告诉你的是Zoom。 其他人也许能够做到。 它们可能更漂亮,但是当您的目的是最大化性能时,它们不会比手动方法更快或更好。