【问题标题】:Profiling short-lived Java applications分析短期 Java 应用程序
【发布时间】:2011-02-09 00:11:49
【问题描述】:

是否有任何 Java 分析器可以分析短期应用程序?到目前为止,我发现的分析器似乎可以与一直运行到用户终止的应用程序一起使用。但是,我想分析像命令行实用程序一样工作的应用程序,它会立即运行并退出。 visualvm 或 NetBeans Profiler 等工具甚至无法识别应用程序已运行。

我正在寻找类似于 Python 的 cProfile 的东西,因为在应用程序退出时会返回分析器结果。

【问题讨论】:

  • 如果它是短暂的,为什么要分析它?分析的全部推动力是当事情花费太长时间时,对吧?
  • 在这种情况下,我提到的短暂的意思是类似于命令行实用程序的东西,它在执行后会立即结束。但是,它们仍然可能需要太长时间才能满足要求(例如,30 秒,最好少于 5 秒)。因此,确定哪些部分是瓶颈仍然很有用。

标签: java optimization profiling profiler


【解决方案1】:

您可以使用 JVM 内置 HPROF 分析您的应用程序。

它提供了两种方法:

  1. 采样堆栈上的活动方法
  2. 计时 使用注入字节码(BCI,字节码注入)的方法执行时间

抽样

此方法显示在堆栈顶部找到方法的频率。

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 documentation 上找到帮助

【讨论】:

  • 我试过 hprof 但它似乎只能转储堆配置文件。你知道是否也可以将 cpu 时间数据转储到文件中吗?
  • 完全修改了当前站点标准的答案(通过添加有用的信息/示例)并修复了损坏的链接
  • hprof 代理已在 java 9 中删除,JEP 240
【解决方案2】:

Sun Java 6 具有java -Xprof 开关,可以为您提供一些分析数据。

-Xprof            output cpu profiling data

【讨论】:

  • 这是获取粗略信息的一种非常快速的方法。很高兴知道!
【解决方案3】:

运行 30 秒的程序不是短暂的。你想要的是一个分析器,它可以启动你的程序,而不是你必须附加到一个正在运行的系统。我相信大多数分析器都可以做到这一点,但您很可能最喜欢集成在 IDE 中的分析器。看看 Netbeans。

【讨论】:

    【解决方案4】:

    分析一个运行时间短的 Java 应用程序有几个技术难题:

    • 分析工具通常通过定期采样处理器的 SP 或 PC 寄存器来查看应用程序当前执行的位置。如果您的应用程序的生命周期很短,则可能采集的样本不足,无法获得准确的图像。

    您可以通过修改应用程序以循环运行多次来解决此问题,正如@Mike 所建议的那样。如果您的应用调用System.exit(),您会遇到问题,但主要问题是...

    • 短期 Java 应用程序的性能特征可能会因 JVM 预热效应而失真。加载应用所需的类会花费大量时间。然后您的代码(和库代码)将被解释一下,直到 JIT 编译器弄清楚需要编译为本机代码的内容。最后,JIT 编译器会花时间完成它的工作。

    我不知道分析器是否试图补偿 JVM 预热效应。但即使它们确实如此,这些影响也会影响您的应用程序的实际行为,并且应用程序开发人员无法采取很多措施来减轻它们。

    回到我之前的观点......如果你在一个循环中运行一个短暂的应用程序,你实际上是在做一些修改它的正常执行模式并删除 JVM 预热组件的事情。因此,当您优化在修改后的应用程序中占用(例如)50% 执行时间的方法时,实际上是 50% 的时间不包括 JVM 预热。如果 JVM 预热正在使用(比如说)应用程序正常执行时 80% 的执行时间,那么您实际上是在优化 20% 的 50% ......这是不值得的。

    【讨论】:

    • +1 好的 cmets。我只想指出,关于您关于分析工具的第一点,1)除了最简单的程序之外,对 PC 寄存器进行采样几乎是无用的(与对堆栈进行采样相比),以及 2)不需要太多的样本,因为不需要时间测量(假设目标是找到有成效的优化点)。以下是关于该主题的更多信息:stackoverflow.com/questions/1777556/alternatives-to-gprof/…
    【解决方案5】:

    如果它花费的时间不够长,只需围绕它进行一个循环,如果你愿意,可以是一个无限循环。这不会影响花在函数或代码行上的时间百分比。然后,考虑到这需要大量时间,I just rely on this technique。这告诉了哪些代码行,无论它们是否是函数调用,花费的时间百分比最高,因此如果可以避免它们,将获得最大的收益。

    【讨论】:

      【解决方案6】:

      在启用分析的情况下启动您的应用程序,等待分析器附加。任何符合 Java 分析架构的分析器都应该可以工作。我已经用 NetBeans 的分析器试过了。

      基本上,当您的应用程序启动时,它会在执行前等待附加分析器。因此,从技术上讲,甚至可以分析代码执行行。

      通过这种方法,您可以从线程、内存、cpu、方法/类调用时间/持续时间等方面分析各种事物...

      http://profiler.netbeans.org/

      【讨论】:

        【解决方案7】:

        SD Java Profiler 可以捕获语句块执行计数数据,无论您的运行时间有多短。相对执行计数会告诉您时间花在了哪里。

        【讨论】:

          【解决方案8】:

          您可以使用测量(计量)记录:http://www.jinspired.com/site/case-study-scala-compiler-part-9 您还可以检查生成的快照:http://www.jinspired.com/site/case-study-scala-compiler-part-10

          免责声明:我是 JXInsight/OpenCore 的架构师。

          【讨论】:

            【解决方案9】:

            我建议你试试你的工具包。它可以从一开始就进行分析,并在程序完成时转储结果。您必须为此付费,但您可以获得评估许可证或在没有评估许可证的情况下使用 EAP 版本。 (限时)

            【讨论】:

              【解决方案10】:

              YourKit 可以拍摄个人资料会话的快照,以后可以在 YourKit GUI 中对其进行分析。我使用它来分析我正在处理的命令行短期应用程序。详情请参阅我对this question 的回复。

              【讨论】:

                猜你喜欢
                • 2011-11-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-01-29
                • 2011-01-07
                • 2017-06-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多