【问题标题】:Java profiling - how can I get a method by method analysis of my application?Java 分析 - 如何通过方法分析我的应用程序获得方法?
【发布时间】:2011-01-17 01:52:17
【问题描述】:

我想运行我的 Java 应用程序并且对于给定的工作负载能够看到:

  • 给定函数被调用了多少次
  • 每个函数调用的相对成本(即每个函数调用的执行时间)

我大致知道我的应用程序的瓶颈在哪里,但我需要更细粒度的视图来缩小它。

谢谢

编辑 jvisualvm 看起来像工具 - 它在大约 30 秒内发现了问题。我只需要知道在方法配置文件的上下文中“selftime”是什么意思。谢谢

【问题讨论】:

  • 自时间是执行时间,不包括被调用的方法。示例:方法a() 执行计算,同时调用方法b()c()。所以a()的自身时间会包括a()本身的计算,但不包括b()c()所花费的时间。
  • 谢谢,我就是这么想的
  • @EliAcherkan “计算”是什么意思?任何与原语的操作?创建一个新对象怎么样?这应该包括在自拍时间中吗?

标签: java profiling


【解决方案1】:

看看Eclipse TPTP。他们可以为从 Eclipse 启动的任何应用程序提供更多功能。

【讨论】:

【解决方案2】:

最简单的方法是使用-prof,例如: java -prof -jar yourjar.jar

这将在程序运行完成后打印一个名为 java.prof 的文件。

HPROF documentation page

在我的应用程序中,我使用: -Xrunhprof:cpu=samples,thread=y,doe=y

这会打印一份报告,其中包含以下内容:

CPU SAMPLES BEGIN (total = 55110) Sun Feb  7 17:02:51 2010
rank   self   accum   count  trace  method
1      69.68% 69.68%   38399 300361 java.net.SocketInputStream.socketRead0
2      24.40% 94.08%   13448 300386 java.net.SocketInputStream.socketRead0
3      0.20%  94.28%     108 300425 java.io.FileOutputStream.writeBytes
4      0.19%  94.47%     107 300976 java.net.PlainDatagramSocketImpl.receive0
5      0.19%  94.65%     102 300414 package.BlockingSampleBuffer.addSample
6      0.16%  94.82%      90 300365 java.net.SocketOutputStream.socketWrite0
7      0.16%  94.98%      89 300412 package.BlockingSampleBuffer.addSample
8      0.15%  95.13%      84 300430 java.lang.Object.wait
9      0.14%  95.27%      77 300592 java.io.FileOutputStream.writeBytes
10     0.14%  95.41%      76 300566 java.lang.AbstractStringBuilder.<init>

因此您可以查看在各种方法中花费的总时间(以秒为单位)。 在我的应用程序中,大部分时间都在等待来自远程主机的数据(不太可能通过互联网连接)。

【讨论】:

    【解决方案3】:

    对于在 Sun 的 java 6 中运行的程序,最简单的方法是使用 jdk 中的 jvisualvm 程序。允许您在没有任何特殊设置的情况下附加和配置文件。

    【讨论】:

    • jvisualvm 在我看来是最好的免费工具。 Eclipse TPTP 很重,不太好用。
    • 这是一个破解小工具,谢谢。只是一个问题,在线程配置文件的上下文中,“自我时间”是什么意思?
    【解决方案4】:

    如果你愿意花一点钱,

    JProfiler: http://www.ej-technologies.com/products/jprofiler/overview.html

    非常好,它显示了使用时间的百分比、使用的绝对时间以及方法级别的调用次数。它理解 EJB 调用、Web 服务调用,甚至会显示 jdbc 调用的 SQL。我经常使用它来查找性能问题。

    它也有内存分析,但我发现 cpu 分析更有用。

    【讨论】:

    • 值得注意的是,这本质上是一个向您显示 hprof 输出的界面(见上文),有可用的免费界面,但这些界面的解释较少/不太漂亮。
    【解决方案5】:

    列出了几个分析器(Eclipse 和 JProfiler)。我只是想强烈建议分析器是您的编程工具箱中的工具之一。

    这是大多数程序员忽略的事情,但分析器可以解决其他很难解决的所有问题。

    我只是说(对每个人,而不仅仅是提问者),如果你还没有使用分析器,那就去找一个,下载并运行它。

    顺便说一句,它们比 java 工具的静态输出要强大得多——尽管在这种特定情况下 java 工具可能就足够了。分析器可以告诉您每个线程在做什么,并且可以制作一些非常酷的调用图形(流程图样式),这将帮助您分析不是您编写的代码。

    只要找到一个,然后使用一两个星期,你就会知道它提供了什么。

    【讨论】:

      【解决方案6】:

      这正是 AOP 提供帮助的地方。可以在不更改代码的情况下添加/删除方面。 如果您使用的是 Spring;创建 Aspect,包括 JoinPoint、Advice,列出用于评估执行时间的类和公共方法。将这些 bean 添加到 Spring 配置中。 否则将 AspectJ Container 用于非 Spring 应用程序

      【讨论】:

        【解决方案7】:

        Java 1.7* 与 Java Mission Control (jmc) 捆绑在一起,它具有“飞行记录器”功能,可用于分析方法执行。分析结果的显示几乎与 AppDynamics 相似 - 很容易发现性能问题(尤其是哪些方法占用了所有 CPU)。

        虽然不详细,但很好的博客文章解释了关于飞行记录器:http://hirt.se/blog/?p=364

        * 不确定次要版本

        【讨论】:

        • 我尝试使用江铃。它看起来很专业,但最终它并没有放弃你需要的东西——执行某件事需要多长时间,或者需要最长的时间。 JMC会告诉你什么叫最多……或者说是什么占用时间最多……但是对比jvisualvm,结果是不一样的,jvisualvm的结果看起来更可信。
        猜你喜欢
        • 1970-01-01
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多