我经常使用VisualVM运行Java应用程序,但需要X才能在计算机上运行。
我知道我可以通过管理端口连接,但这将是一个离线采样分析,这对我来说还不够。
所以我正在寻找一种解决方案,我可以从命令行分析正在运行的Java应用程序的方法的CPU使用情况。这足以让我在服务器上收集数据,然后可以在不同的机器上分析收集的数据。
更新
似乎我需要更加具体。我想从命令行分析正在运行的Java应用程序,我不想阻止它并重新运行它。
答案 0 :(得分:27)
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
答案 1 :(得分:13)
您可以使用 jstack 收集10或20个堆栈样本吗?然后,如果 Foo 是一种方法,则其总时间使用量是包含它的样本的分数。其CPU使用率是那些不在I / O或系统调用中终止的样本的一部分。它的“自我时间”是它本身就是终点的样本的一部分。
我不需要任何漂亮的东西。我要么在IDE下运行它并以这种方式收集它们,要么使用 jstack 之类的东西来快照正在运行的应用程序的堆栈。
这是random-pause技术。
答案 2 :(得分:13)
看起来从命令行配置java应用程序的“内置”方法是使用profiling命令行参数启动它,比如
$ java -Xrunhprof:cpu=samples,file=myprogram.hprof ...
然后在进程退出后(当时创建文件),使用一些GUI工具(或jhat之类的Web服务器工具)或command line tool检查文件“myprogram.hprof”。 / p>
如果您使用“QUIT”信号技巧,提到https://stackoverflow.com/a/2344436/32453,那么您可以随意生成文件而不退出JVM(它似乎附加到上一个输出文件)。或者等到进程退出并生成文件。
此(内置)分析器不经常进行样本,因此整体上通常具有较低的减速/影响。
答案 3 :(得分:5)
我们在服务器上使用过hprof,如果你无法运行完整的VisualVM会话,它肯定比sysouts更好。
使用hprof的例子很多:
答案 4 :(得分:2)
您可以远程运行大多数商业资料管理器,以便在服务器上运行代理,然后通过开发计算机上的客户端连接到该代理。我最喜欢的探查器是JProfiler。这是相当合理的购买,而且非常稳定(并非所有的商业分析师都是如此)。
http://www.ej-technologies.com/products/jprofiler/overview.html
其他稳定但不是我最喜欢的商业分析器是YourKIT。
那些较小的供应商提供了很好的工具。这些工具将为您提供大量有关方法时序,内存使用,GC等的信息。远不止jconsole。
答案 5 :(得分:1)
剖析“已经启动”的JVM的一种方法是聚合随着时间推移而使用的多个jstack。
例如,您可以解析并将其显示为FlameGraph(请参阅该链接的各种答案的详细信息,在此我将不再赘述)。
答案 6 :(得分:1)
https://github.com/jvm-profiling-tools/async-profiler可以实现最精确的性能分析。
该项目是Java的低开销采样探查器,不会遇到安全点偏差问题。它具有特定于HotSpot的API,以收集堆栈跟踪并跟踪内存分配。探查器可与基于HotSpot JVM的OpenJDK,Oracle JDK和其他Java运行时一起使用。
这是我的脚本,用于从命令行安装和运行它:
async-profiler.sh
if [ ! -d profiler ]; then
mkdir profiler && cd profiler && curl -L https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.6-ea/async-profiler-1.6-ea-linux-x64.tar.gz | tar xvz
echo 1 > /proc/sys/kernel/perf_event_paranoid
echo 0 > /proc/sys/kernel/kptr_restrict
#apt install openjdk-8-dbg
else
cd profiler
fi
#jps
./profiler.sh -d 60 -f dump_`date +%Y-%m-%d_%H-%M-%S`.jfr `jps -q`
它假定应用程序在同一用户下运行,并且jps列出了一个Java进程PID。 分析持续时间为60秒。 无需修改应用程序的启动选项或重新启动。
用于检查转储的GUI内置于IntelliJ IDEA Ultimate:https://www.jetbrains.com/help/idea/cpu-profiler.html。