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