【问题标题】:Profiling application with VisualVM使用 VisualVM 分析应用程序
【发布时间】:2013-12-29 12:54:36
【问题描述】:
假设您有一个命令行应用程序,它接受输入文件并对其进行处理。现在假设您想要对这个应用程序进行采样/分析。如果是 Visual Studio,您只需选择分析方法(采样/仪器),VS 将为您运行应用程序并在程序完成时收集数据。但据我所知,VisualVM 中没有类似的功能。您必须运行您的应用程序,然后在 VisualVM 中选择它,然后显式开始采样/分析。问题是有时执行具有某些输入数据的程序所花费的时间少于设置 VisualVM 所需的时间。同样使用这种方法,不可能批量分析应用程序。有人建议从 Eclipse 以调试模式启动应用程序,并在 main() 方法的开头某处设置断点。然后设置 VisualVM 并继续执行。但我怀疑在 Debug vs Release 模式下运行本身会对性能产生影响。
有什么建议吗?
【问题讨论】:
标签:
java
profiling
visualvm
【解决方案1】:
如果程序执行 I/O,Visual Studio 采样器将看不到 I/O,因为它是一个“CPU 采样器”(即使几乎所有时间都花在等待 I/O)。
如果您使用 Instrumentation,您将看不到任何行级信息,因为它仅在函数级别进行汇总。
我使用this technique。
如果程序运行得太快而无法采样,只需在其周围放置一个临时外循环,例如 100 或 1000 次迭代。
Debug 和 Release 模式之间的区别几乎没有,除非您花费大量时间在紧密循环中,在您的代码中,其中循环不包含任何函数调用,或者如果您正在执行在库中进行大量验证的数据结构操作。
如果您是,那么您的样本将显示您是,并且您会知道 Release 会产生速度差异。
就批处理分析而言,我不知道。我只关注程序的整体吞吐率。如果有一些输入似乎使它花费了太长时间,那么我使用该输入在程序上执行采样过程,看看问题是什么,然后解决它。