如何在生产中生成cpu快照?

时间:2014-04-17 20:22:42

标签: java profiling

使用VisualVM,我可以附加到本地java进程,启动/停止CPU分析,并生成快照。我甚至不需要用任何特殊的代理商来处理这个过程。

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

最好,我运行的任何程序都应该是可以自由发布的,这样我就可以将它与我的Java应用程序捆绑在一起并让它在客户环境中可用。

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

到目前为止,我发现的最接近的是使用hprof

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

但是这需要重新启动以开始分析而另一个需要停止,因为我没有看到在运行时打开和关闭采样的方法。

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

2 个答案:

答案 0 :(得分:3)

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

当您使用适当的选项(如

)运行应用程序时,请回想一下
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9876
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

(如果您需要安全传输,请替换后两者)您可以使用“添加JMX连接”和JVisualVM作为地址,使用GUI从另一台计算机连接servername:9876

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


当您使用JVisualVM连接到本地JVM时,唯一的区别是它将检测本地应用程序并告诉它们加载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,因此您可以将其更改为远程连接。

答案 1 :(得分:0)

你有没有尝试过你的Java Profiler? 它为性能做了很多事情 但它也显示了cpu的使用和....

您可以使用它来快照cpu并在生产中显示它 从下面链接您可以找到文件并下载它:

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