在 VisualVM 中分析整个 Java 程序的执行

2022-09-01 08:58:24

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

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

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


答案 1

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


答案 2

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

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

Eclipse VisualVM plugin

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

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

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

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


推荐