在VisualVM中评测整个Java程序的执行

在VisualVM中评测整个Java程序的执行,java,profile,visualvm,Java,Profile,Visualvm,在Java评测中,似乎现在所有(免费)的道路都通向JDK6附带的VisualVM评测器。它看起来像一个很好的程序,每个人都吹嘘如何将它作为一个主要功能“附加到正在运行的进程”。问题是,这似乎是在本地进程上使用它的唯一方法。我希望能够在分析器中启动我的程序,并跟踪其整个执行过程 我尝试过使用中描述的-Xrunjdwp选项,但在两种传输方法(共享内存和服务器)之间,这两种方法都没有用。VisualVM似乎与前者没有任何集成,VisualVM拒绝连接到localhost或127.0.0.1,因此后者也

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

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


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

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

如果可以修改应用程序,在VisualVM中设置探查器时挂起它的状态,那么可以使用VisualVM Eclipse插件进行修改。我不确定为什么会出现NullPointerException,因为它似乎在我的工作站上工作。您需要通过提供到
jvisualvm
二进制文件的路径和JDK的路径来配置插件;这是通过访问Windows->Preferences->Run/Debug->Launching->VisualVM configuration(如下面的屏幕截图所示)上的VisualVM配置对话框来完成的

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

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

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

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

请考虑使用类似的工具来使用和打开数据文件,或者只在您喜爱的编辑器中读取生成的文本文件

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虚拟机


带有
-Xrunjdwp
的建议不正确。它只启用调试器,并使用
suspend=y
等待调试器连接。因为VisualVM不是调试器,所以它对您没有帮助。但是,插入
System.in
Thread.sleep()
将暂停启动,并允许VisualVM连接到应用程序。请务必阅读并更好地理解探查器设置。还请注意,您可以使用VisualVM中的“Sampler”选项卡来代替评测,它更适合评测整个java程序执行。正如前面提到的,您也可以使用NetBeans Profiler,它直接支持对应用程序启动进行分析。

现在可以使用to-VisualVM进行分析。

根据您提到的问题,您是否尝试了
suspend=y
,而不是发布的
suspend=n
?如果是这样的话,您不需要从
系统中读取。在
中。是的,但这并不重要。我看不到任何方法可以将程序连接到VisualVM,不管参数是
suspend
。应该有一个“正确”的地方。当然,VisualVM可以看到这个过程。问题是它无法分析它。啊,我知道你现在在尝试什么。
suspend=y
标志适用于理解JDWP协议的探查器。VisualVM不同于那些探查器,因此您会发现它只是等待,而不会连接到应用程序打开的端口,应用程序也会同样等待。我会尽快发布一个答案;需要解决一些细节。我没有看到任何死链接在。你能给我看一些吗?谢谢,那正是我想要的