33

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

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

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

4

4 回答 4

20

考虑使用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 虚拟机中所有监视器和线程的完整堆转储和状态。

于 2011-08-17T21:02:02.853 回答
11

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

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

Eclipse VisualVM 插件

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

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

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

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

于 2011-08-17T20:34:13.277 回答
4

这现在可以通过VisualVM的启动分析器插件来实现。

于 2014-02-24T14:37:03.130 回答
3

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

于 2011-08-18T07:04:22.303 回答