如果某个东西正在使单线程程序占用,比如10倍,那么就可以在其上运行一个分析器.您也可以通过"暂停"按钮暂停它,您将看到它正在做什么.
即使它比它应该慢了10%,如果你停止它多次,不久你会看到它反复做不必要的事情.通常问题是在堆栈中间某处不是真正需要的函数调用.这不能衡量问题,但确实找到了.
编辑:反对意见主要假设您只采取1个样本.如果你是认真的,请采取10.任何一行代码,导致一定比例的浪费,如40%,将平均出现在该部分样本的堆栈上.瓶颈(单线程代码)无法隐藏它.
编辑:为了表明我的意思,许多反对意见的形式是"没有足够的样本,所以你看到的可能完全是虚假的" - 关于机会的模糊观点.但是,如果任何可识别的描述,不仅仅是在常规或常规活动中,在30%的时间内有效,那么在任何给定样本上看到它的概率是30%.
然后假设只采集了10个样本.在10个样本中看到问题的次数遵循二项分布,并且看到它0次的概率是.028.看到它1次的概率是.121.2次,概率为.233,而3次则为.267,之后下降.由于看到它少于两次的概率是.028 + .121 = .139,这意味着看到它两次或更多次的概率是1 - .139 = .861.一般规则是,如果您看到可以修复两个或更多样本的内容,则值得修复.
在这种情况下,在10个样本中看到它的机会是86%.如果你是14%没有看到它的人,那就去做更多的样品.(如果样本数量增加到20,那么两次或多次观察的几率会增加到99%以上.)所以它没有经过精确测量,但已经准确找到了,重要的是要了解它它可能很容易成为分析器无法实际找到的东西,例如涉及数据状态的东西,而不是程序计数器.
我正在尝试描述我的java应用程序,只是为了找出花费大部分时间的方法.鉴于TPTP的反应不佳,我以为我会给Java VisualVM一个机会.
这一切似乎都很简单 - 除了我似乎无法从中得到任何一致或有用的东西.
我似乎无法看到任何与我自己的代码有关的内容 - 我得到的是对java.*方法等一大堆调用.
我已经尝试将检测限制在我自己的包中,这似乎减少了检测方法的数量,但我似乎还没有看到自己的方法.
每次运行时,我都会获得不同数量的方法,范围从10到1000.我已经尝试在我的应用程序启动时进入睡眠状态,以确保在应用程序开始执行任何有趣操作之前启动并运行VisualVM,以确保在有趣的内容运行时进行分析.
我有什么必须做的,以确保我的课程得到检验吗?有时间问题吗?.. like,必须等待类加载等?我也尝试过两次运行代码的内核,以确保所有代码都得到了运行...
我刚刚从Eclipse运行一个带有main的应用程序.我尝试使用Eclipse集成,以便在启动应用程序时VisualVM启动 - 结果是相同的.我也尝试将应用程序导出为可运行的应用程序,并从命令行独立运行它,而不是通过Eclipse运行 - 结果相同.
我的应用程序不是一个长期运行的Web应用程序等 - 只是一个主要调用我自己的其他类来进行一些处理,然后退出.
对于我可能做错的任何建议,我将不胜感激!:)
谢谢 !
我想在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%).很多用户似乎都有这个问题,例如