[英]Profiling short-lived Java applications
是否有任何Java分析器允许分析短期应用程序? 到目前为止,我发现的分析器似乎适用于在用户终止之前一直运行的应用程序。 但是,我想要分析像命令行实用程序一样工作的应用程序,它会立即运行和退出。 像visualvm或NetBeans Profiler这样的工具甚至无法识别应用程序是否已运行。
我正在寻找类似于Python的cProfile的东西,因为当应用程序退出时会返回探查器结果。
您可以使用JVM内置HPROF来分析您的应用程序。
它提供了两种方法:
此方法显示了在堆栈顶部找到方法的频率。
java -agentlib:hprof=cpu=samples,file=profile.txt ...
此方法计算方法的实际调用。 仪表代码已由JVM预先注入。
java -agentlib:hprof=cpu=times,file=profile.txt ...
注意:此方法会大大减慢执行时间。
对于这两种方法,如果file=
选项不存在,则默认文件名为java.hprof.txt
。
可以使用java -agentlib:hprof=help
获取完整帮助,也可以在Oracles文档中找到
Sun Java 6具有java -Xprof
开关,它可以为您提供一些分析数据。
-Xprof output cpu profiling data
对正在运行的Java应用程序进行概要分析存在一些技术难题:
您可以通过修改应用程序以循环运行多次来解决此问题,如@Mike所建议的那样。 如果您的应用程序调用System.exit()
,您将遇到问题,但主要问题是......
我不知道分析器是否试图补偿JVM预热效果。 但即使他们这样做,这些影响也会影响应用程序的实际行为,并且应用程序开发人员可以做很多事情来缓解它们。
回到我之前的观点......如果你在循环中运行一个短暂的应用程序,你实际上正在做一些修改其正常执行模式并删除JVM预热组件的东西。 因此,当您优化在修改后的应用程序中占用(比如说)50%执行时间的方法时,这实际上是50%的时间, 不包括JVM预热 。 如果JVM预热正在使用(比如说)正常执行应用程序的80%的执行时间,那么实际上你正在优化20%的50%...这是不值得的。
运行30秒的程序不会短暂。 你想要的是一个可以启动程序的分析器,而不是你必须连接到正在运行的系统。 我相信大多数剖析器都可以做到这一点,但你很可能会喜欢在IDE中集成最好的。 看看Netbeans吧。
如果它没有花费足够长的时间,只需在它周围环绕一个循环,如果你愿意,可以使用无限循环。 这对于在函数或代码行中花费的包含时间百分比没有影响。 然后,鉴于它需要花费大量时间, 我只依靠这种技术 。 这告诉哪些代码行,无论它们是否是函数调用,都花费了最高的时间百分比,因此如果可以避免则会获得最大的代价。
打开配置文件启动应用程序,等待分析器附加。 任何符合Java分析架构的分析器都应该有效。 我用NetBeans的探查器试过这个。
基本上,当您的应用程序启动时,它会等待在执行之前附加一个分析器。 因此,从技术上讲,甚至可以对代码执行行进行分析。
使用这种方法,您可以分析线程,内存,CPU,方法/类调用时间/持续时间等各种事物...
无论您的运行有多短, SD Java Profiler都可以捕获语句块执行计数数据。 相对执行计数将告诉您花费的时间。
您可以使用测量(计量)记录: http : //www.jinspired.com/site/case-study-scala-compiler-part-9您还可以检查生成的快照: http : //www.jinspired.com /网站/案例研究-斯卡拉编译部分-10
免责声明:我是JXInsight / OpenCore的架构师。
我建议你试试你的套装。 它可以从一开始就进行分析,并在程序结束时转储结果。 您必须为此付费,但您可以获得eval许可证或使用没有EAP版本的EAP版本。 (时间有限)
YourKit可以拍摄配置文件会话的快照,稍后可以在YourKit GUI中进行分析。 我使用它来分析我工作的命令行短期应用程序。 有关详细信息,请参阅此问题的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.