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

kbo*_*ino 32 java profile visualvm

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

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

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

Ami*_*ani 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[]
Run Code Online (Sandbox Code Playgroud)

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


Vin*_*lds 11

在不修改应用程序的情况下解决此问题的最佳方法是根本不使用VisualVM.就其他免费选项而言,您可以使用Eclipse TPTPNetbeans分析器,或者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中)不允许您在挂起的进程上配置分析器,因为它根本不显示Profiler选项卡.