在命令行中分析正在运行的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。
那些较小的供应商是很好的工具 这些工具将为您提供方法计时,内存使用,GC等方面的大量信息。远远超过jconsole。