2014-04-17 19 views
4

使用VisualVM,我可以附加到本地java进程,启动/停止CPU分析并生成快照。我甚至不需要使用任何特殊代理等进行过程测试。如何在生产中生成cpu快照?

是否可以在无头生产服务器上执行相同的操作?我知道我可以配置该过程来远程连接调试器,但我想尽量减少更改客户环境的数量和影响。我只是想运行一段命令来配置文件一段时间,并生成一个快照文件,我可以使用VisualVM或同等工具将文件扫描到我的工作站进行分析。

最好,我运行的任何程序都应该可以自由重新分发,以便我可以将其与Java应用程序捆绑在一起,并让它在客户环境中可用。

理想情况下,就像使用VisualVM一样,我希望能够在不重启的情况下连接到正在运行的系统。

我发现到目前为止是插装与hprof最接近:

java -agentlib:hprof=cpu=samples,interval=20,depth=3 classname 

但需要重新启动才能开始分析和另一个停下来,因为我没有看到一个办法把采样并在运行时关闭。

有没有更好的方法?如果没有开箱即用的解决方案,那么如何构建它?它必须是可能的,因为VisualVM做到了。

回答

0

你有没有试过yourkit java profiler? 它很多事情表现 但它也表明CPU使用率和....

,你可以用它来从下面快照CPU,并显示在您的生产 链接,你可以找到文件,并下载:

http://yourkit.com/features/index.jsp#cpu_compare_snapshots

+0

我不认为这回答了我的问题。我想知道如何在无头环境中捕捉CPU快照。 YourKit是否有命令行模式? – ykaganovich

+0

我会回答,因为这个问题是关于YourKit分析器。是的,YouKit拥有控制分析的命令行工具http://www.yourkit.com/docs/java/help/command_line_tool.jsp您不需要YourKit GUI来启动/停止分析和捕获快照。而且您不需要GUI来将Java EE服务器与Profiler代理整合。有一个命令行Java EE集成向导http://www.yourkit.com/docs/java/help/profiling_j2ee_remote.jsp –

3

你并不需要一个调试连接,你只需要一个JMX连接。但也许这就是你的意思。

要记得,当您运行与适当的选件的应用像

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9876 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 

(取代后两者,如果您需要安全传输),你只需用JVisualVM从另一台机器与GUI使用“添加连接JMX连接“和servername:9876作为地址。当您使用JVisualVM连接到本地JVM

详细情况http://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.htmlhttp://visualvm.java.net/jmx_connections.html


给出的,唯一的区别是,它会检测本地应用程序,并告诉他们加载JMX代理如果它尚未运行。

因此,您可以编写一个小的本地命令行应用程序在服务器上执行并连接到JVM并启动JMX代理。 JMX代理启动后,您可以远程连接JVisualVMThe program in this answer显示如何做到这一点。

它使用Attach API来定位JVM并告诉它加载JMX代理并打开JMX连接。如果您将远程打开使用JVisualVM的JMX连接,则可以省略第二步。

或者,您可以使用打开的JMX连接将此程序扩展到命令行采样工具。 The first example code of this answer给出了如何实现采样器的想法。它采样它自己的JVM,但由于它使用了ThreadMXBean,所以您可以轻松地将其更改为用于远程连接。