【问题标题】:Profile Entire Java Program Execution in VisualVM在 VisualVM 中分析整个 Java 程序的执行
【发布时间】:2011-10-29 02:17:05
【问题描述】:

在 Java 分析中,现在似乎所有(免费)道路都通向 JDK6 中包含的 VisualVM 分析器。它看起来像一个很好的程序,每个人都吹捧如何将“附加到正在运行的进程”作为主要功能。问题是,这似乎是在本地进程上使用它的唯一方法。我希望能够在分析器中启动我的程序,并跟踪其整个执行过程

我曾尝试使用how to profile application startup with visualvm 中描述的-Xrunjdwp 选项,但是在两种传输方法(共享内存和服务器)之间,对我来说都没有用。 VisualVM似乎与前者没有任何集成,VisualVM拒绝连接localhost127.0.0.1,所以后者也不好。我还尝试在我的程序中插入一个简单的System.in 读取以插入执行暂停,但在这种情况下,VisualVM 会阻塞直到读取完成,并且在执行完成之前不允许您开始分析。 我也尝试过查看the Eclipse plugin,但该网站充满了死链接,当我尝试使用它时,启动器会崩溃并显示NullPointerException(这可能不再准确)。

来自 C 语言,这对我来说似乎不是一项特别困难的任务。我只是错过了什么还是这真的是一个不可能的要求?我愿意接受任何类型的建议,包括使用不同的(也是免费的)分析器,而且我不反对命令行。

【问题讨论】:

  • 按照您提到的那个问题,您是否尝试过suspend=y,而不是发布的suspend=n?如果是这种情况,您就不需要阅读System.in
  • 是的,但没关系。无论suspend 参数如何,我都看不到任何将程序连接到VisualVM 的方法。
  • 那里应该有一个“适当的”。当然,VisualVM 可以看到这个过程。问题是它无法对其进行分析。
  • 啊,我明白你现在正在尝试什么。 suspend=y 标志适用于了解 JDWP 协议的分析器。 VisualVM 与那些分析器不同,因此您会发现它只会等待,而不连接到应用程序打开的端口,应用程序也会等待。我会尽快发布答案;需要弄清楚一些细节。
  • 我在 visualvm.java.net/eclipse-launcher.html> 没有看到任何死链接。你能给我看一些吗?

标签: java profile visualvm


【解决方案1】:

现在可以通过 startup profiler plugin 到 VisualVM 来实现。

【讨论】:

  • Startup Profiler 告诉它使用 VisualVM 1.3.6 运行,并且不能使用 VisualVM 1.8.0 加载。所以至少在当前版本中这是行不通的。
【解决方案2】:

考虑使用HPROF 并使用HPjmeter 之类的工具打开数据文件 - 或者只是在您喜欢的编辑器中读取生成的文本文件。

Command used: javac -J-agentlib:hprof=heap=sites Hello.java

SITES BEGIN (ordered by live bytes) Fri Oct 22 11:52:24 2004
          percent          live          alloc'ed  stack class  rank   self  accum     bytes objs     bytes  objs trace name
    1 44.73% 44.73%   1161280 14516  1161280 14516 302032 java.util.zip.ZipEntry
    2  8.95% 53.67%    232256 14516   232256 14516 302033 com.sun.tools.javac.util.List
    3  5.06% 58.74%    131504    2    131504     2 301029 com.sun.tools.javac.util.Name[]
    4  5.05% 63.79%    131088    1    131088     1 301030 byte[]
    5  5.05% 68.84%    131072    1    131072     1 301710 byte[]

HPROF 能够显示 CPU 使用率、堆分配统计信息、 并监控争用配置文件。此外,它还可以报告 完成堆转储和所有监视器和线程的状态 Java 虚拟机。

【讨论】:

  • 谢谢,这正是我想要的!
【解决方案3】:

-Xrunjdwp 的建议不正确。它只是启用调试器并使用suspend=y 等待调试器附加。由于 VisualVM 不是调试器,因此对您没有帮助。但是插入System.inThread.sleep() 将暂停启动并允许VisualVM 附加到您的应用程序。请务必阅读 Profiling with VisualVM 1Profiling with VisualVM 2 以更好地了解分析器设置。另请注意,您可以使用 VisualVM 中的“Sampler”选项卡代替分析,这更适合分析 整个 java 程序执行。如前所述,您还可以使用 NetBeans Profiler,它直接支持应用程序启动的分析。

【讨论】:

    【解决方案4】:

    在不修改应用程序的情况下解决此问题的最佳方法是根本不使用 VisualVM。至于其他免费选项,您可以使用 Eclipse TPTPNetbeans profiler,或者您的 IDE 附带的任何选项。

    如果您可以修改您的应用程序,以便在您在 VisualVM 中设置分析器时暂停它的状态,那么使用 VisualVM Eclipse 插件很有可能做到这一点。我不确定您为什么会收到 NullPointerException,因为它似乎可以在我的工作站上运行。您需要通过提供jvisualvm 二进制文件的路径和JDK 的路径来配置插件;这是通过访问 Windows -> 首选项 -> 运行/调试 -> 启动 -> VisualVM 配置中的 VisualVM 配置对话框来完成的(如下面的屏幕截图所示)。

    您还需要将应用程序配置为使用 VisualVM 启动器启动,而不是默认的 JDT 启动器。

    如果 VisualVM 已经在运行,所有从 Eclipse 启动的应用程序现在都将导致 VisualVM 自动跟踪新的本地 JVM。如果您没有运行 VisualVM,那么插件将启动 VisualVM,但它也会继续运行应用程序。

    从上一句推断,很明显,在执行任何处理之前让应用程序在main() 方法中停止是非常有用的。但是,这不是暂停应用程序的主要原因。显然,VisualVM 或其 Eclipse 插件不允许自动启动 CPU 或内存分析器。这意味着这些分析器必须手动启动,因此需要暂停应用程序。

    此外,值得注意的是,在 JVM 启动中添加标志:-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y 不会帮助您在 VisualVM 的情况下挂起应用程序并设置分析器。这些标志旨在帮助您使用 JDWP 协议实际连接到 JVM 的开放端口的分析器。 VisualVM 不使用此协议,因此您必须使用 JDB 或远程调试器连接到应用程序;但这并不能解决与探查器配置相关的问题,因为 VisualVM(至少从 Java 6 更新 26 起)不允许您在暂停的进程上配置探查器,因为它根本不显示探查器选项卡。

    【讨论】:

    • 我也不知道问题是什么,因为它甚至没有给我 NPE 的堆栈跟踪。无论如何,我一直在寻找更自动化的解决方案,不幸的是 VisualVM 似乎无法胜任这项任务。
    • 未配置插件(正确)将导致可重现的NullPointerException。在我的系统上,设置了“JDK Home”并且“VisualVM Executable”为空,任何使用 VisualVm 启动器的运行配置都将失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多