在命令行中分析正在运行的Java应用程序

我经常用VisualVM来分析运行Java应用程序,但是它需要X在机器上运行

我知道我可以通过pipe理端口连接,但这将是一个离线样本分析,这是不够的。

所以我正在寻找一个解决scheme,我可以通过命令行来分析正在运行的Java应用程序的CPU使用情况。 在服务器上收集数据就足够了,然后可以在不同的机器上分析收集到的数据。

更新:

看来我需要更具体一些。 我想从命令行分析正在运行的Java应用程序,我不想停止它并重新运行它。

jvmtop应用程序是从命令行进行分析的便捷工具。 不需要停止jvm。 用法:

 jvmtop.sh --profile <PID> 

会给你这样的输出,这将在应用程序运行时更新:

  Profiling PID 24015: org.apache.catalina.startup.Bootstrap 36.16% ( 57.57s) hudson.model.AbstractBuild.calcChangeSet() 30.36% ( 48.33s) hudson.scm.SubversionChangeLogParser.parse() 7.14% ( 11.37s) org.kohsuke.stapler.jelly.JellyClassTearOff.parseScript() ... 

好处是它不需要使用仪器。 待分析的jvm的类不会被改变。

如果你正在寻找更可视化的东西,那么看看基于jvmtop的jvm-mon

你可以用jstack收集10或20个堆栈样本吗? 那么如果Foo是一种方法,那么它的总体使用时间就是包含它的样本的一小部分。 其CPU使用率是那些在I / O或系统调用中不终止的样本的一小部分。 它的“自我时间”是其本身就是终点的样本的一小部分。

我不需要任何漂亮的东西。 我要么在IDE下运行它并以这种方式收集它们,要么使用像jstack这样的快照正在运行的应用程序的堆栈。

这是随机暂停技术。

看起来像从命令行分析Java应用程序的“内置”方法是通过分析命令行参数来启动它,像这样

 $ java -Xrunhprof:cpu=samples,file=myprogram.hprof ... 

然后在进程退出(以及此时创build的文件)后,使用一些GUI工具(或者web服务器工具,如jhat )或命令行工具检查文件“myprogram.hprof”。

如果你使用“QUIT”信号技巧,那么你可以根据需要生成一个文件,而不必退出JVM(它似乎附加到前一个输出文件)。 或等到进程退出,它会生成文件。

这个分析器很less出现一个样本,整体上通常只有很低的减速/影响。

ref: http : //thunderguy.com/semicolon/2004/04/18/profiling-a-java-program-easily/

我们在我们的服务器上使用了hprof,如果无法运行完整的VisualVM会话,它肯定比sysout更好。

使用hprof的例子很多:

您可以远程运行大多数商业分析器,以便在服务器上运行代理,然后通过开发机器上的客户端连接到该代理。 我最喜欢的分析器是JProfiler。 这是相当合理的购买,它是非常稳定的(这不是所有的商业剖析器是真实的)。

http://www.ej-technologies.com/products/jprofiler/overview.html

其他稳定的商业分析器,但不是我最喜欢的是YourKIT。

http://www.yourkit.com/

那些较小的供应商是很好的工具 这些工具将为您提供方法计时,内存使用,GC等方面的大量信息。远远超过jconsole。