【问题标题】:Performance profiler for a java applicationjava应用程序的性能分析器
【发布时间】:2011-03-03 09:52:53
【问题描述】:

我需要优化 Java 应用程序。它会拨打一些第 3 方电话。我需要一些好的工具来准确测量单个 API 调用所花费的时间。 给出复杂性的概念- 该应用程序获取一个包含 100 万行的数据源文件,完成处理大约需要一个小时。作为处理的一部分,它会进行一些第 3 方调用(包括一些网络调用)。我需要确定哪些调用比其他调用花费更多时间,并在此基础上找到优化应用程序的方法。

任何建议将不胜感激。

【问题讨论】:

标签: java performance profiling


【解决方案1】:

我可以推荐JVisualVM。这是一个与 Oracle/Sun JDK 捆绑在一起的出色监控/分析工具。只需启动它,连接到您的应用程序并启动 CPU 分析。你应该得到关于时间花费的很好的直方图。

Getting Started with VisualVM 有一个很棒的截屏视频,向您展示如何使用它。

屏幕截图:


另一个更基本的选择是使用-Xprof 命令行选项:

-Xprof

分析正在运行的程序,并将分析数据发送到 标准输出。此选项作为实用程序提供 在程序开发中有用,并不打算成为 用于生产系统。

【讨论】:

【解决方案2】:

我已经使用了几次YourKit,对此我非常满意。然而,我从来没有分析过一个长期运行的操作。

每一行的处理是否相同?在这种情况下,输入文件的大小并不重要。您可以分析一个子集以找出哪些调用是昂贵的。

【讨论】:

  • 是的..我可以减少输入大小!!谢谢
【解决方案3】:

只想提一下inspectIT 工具。它最近变得完全开源 (https://github.com/inspectIT/inspectIT)。它提供了完整而详细的调用图以及上下文信息,有许多开箱即用的传感器用于数据库调用、http 监控、异常等。

接缝非常适合您的用例..

【讨论】:

    【解决方案4】:

    试用 OPNET 的全景软件产品

    【讨论】:

      【解决方案5】:

      听起来普通的分析器在这种情况下可能不是正确的工具,因为它们旨在测量被分析的程序所花费的 CPU 时间,而不是它调用的外部 API,而且它们往往会导致高他们自己的开销并收集大量数据,如果长时间运行,这些数据可能会使您的系统不堪重负。

      如果你真的需要收集这么长时间的性能数据,并且主要用于外部调用,那么Perf4J 可能是一个更好的工具。

      【讨论】:

      • 你确定 perf4j 会工作吗?我尝试使用 System.currentTimeMillis()。它似乎没有提供足够好的准确性。
      • @Nitin:大概它使用了 System.nanoTime(),它具有更好的准确性。但是从您的描述中,我得到的印象是,即使是毫秒粒度也足以满足您的情况下花费最多时间的事情(例如通过网络调用的第三方组件)'。
      【解决方案6】:

      在我们的办公室,我们每天都使用 YourKit 分析器。它的重量真的很轻,可以服务于我们所拥有的大多数与性能相关的用例。

      但我也使用过 Visual VM。它是免费且快速的。在使用 YourKit(YourKit 不是免费软件)之前,您可能想先尝试一下 Visual VM。

      【讨论】:

        【解决方案7】:

        visualvm(SDK 的一部分)和 Java 7 可以生成详细的分析。

        【讨论】:

          【解决方案8】:

          我在不使用 NetBeans 时使用profiler in NetBeans(非常棒,已经内置,无需安装插件)或JVisualVM

          【讨论】: