在Java分析中,现在似乎所有(免费)道路都会导致JDK6附带的VisualVM分析器。它看起来像一个很好的程序,每个人都吹嘘如何“将它附加到正在运行的进程”作为一个主要功能。问题是,这似乎是在本地进程上使用它的唯一方式。我希望能够在启动器中启动我的程序,并跟踪其整个执行。
我尝试使用how to profile application startup with visualvm中描述的-Xrunjdwp
选项,但在两种传输方法(共享内存和服务器)之间,对我来说都没有用。 VisualVM似乎没有与前者集成,VisualVM拒绝连接到localhost
或127.0.0.1
,因此后者也不好。我还尝试在我的程序中插入一个简单的System.in
读取以在执行中插入一个暂停,但在这种情况下,VisualVM会阻塞直到读取完成,并且不允许您在执行之前开始分析。 我也尝试过调查the Eclipse plugin,但网站上充满了死链接,当我尝试使用{/ 1>时,启动器只与NullPointerException
崩溃(这可能不再是准确)。
来自C,这对我来说似乎不是一项特别困难的任务。我只是遗漏了什么或者这真的是一个不可能的要求吗?我愿意接受任何建议,包括使用不同的(也是免费的)探查器,我不反对命令行。
答案 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 TPTP或Netbeans profiler,也可以使用IDE附带的任何选项。
如果您可以修改应用程序,在VisualVM中设置探查器时暂停它的状态,则可以使用VisualVM Eclipse插件完成此操作。我不确定你为什么会得到NullPointerException,因为它似乎在我的工作站上工作。您需要通过提供jvisualvm
二进制文件的路径和JDK的路径来配置插件;这是通过访问Windows上的VisualVM配置对话框完成的 - >偏好 - >运行/调试 - >启动 - > VisualVM配置(如下面的屏幕截图所示)。
您还需要将应用程序配置为从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.in
或Thread.sleep()
将暂停启动并允许VisualVM附加到您的应用程序。请务必阅读Profiling with VisualVM 1和Profiling with VisualVM 2以更好地了解Profiler设置。另请注意,您可以使用VisualVM中的“Sampler”选项卡而不是分析,这更适合分析整个 java程序执行。正如其他提到的,您还可以使用NetBeans Profiler,它直接支持应用程序启动的分析。
答案 3 :(得分:3)
现在可以使用startup profiler plugin到VisualVM。