在VisualVM中配置整个Java程序执行

时间:2011-08-17 16:15:57

标签: java profile visualvm

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

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

来自C,这对我来说似乎不是一项特别困难的任务。我只是遗漏了什么或者这真的是一个不可能的要求吗?我愿意接受任何建议,包括使用不同的(也是免费的)探查器,我不反对命令行。

4 个答案:

答案 0 :(得分: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虚拟机。

答案 1 :(得分:11)

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

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

Eclipse VisualVM plugin

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

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

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

现在可以使用startup profiler plugin到VisualVM。