我经常用VisualVM对Java应用程序进行性能分析,但需要在机器上安装X才能运行。
我知道可以通过管理端口连接,但那只是离线采样的性能分析,对我来说不够。
因此,我正在寻找一种解决方案,可以通过命令行对运行中的Java应用程序方法的CPU使用情况进行性能分析。收集数据后,我可以在另一台机器上分析所收集的数据。
更新:
看起来我需要更具体一些。我想从命令行对运行中的Java应用程序进行性能分析,而不是停止并重新运行它。
我经常用VisualVM对Java应用程序进行性能分析,但需要在机器上安装X才能运行。
我知道可以通过管理端口连接,但那只是离线采样的性能分析,对我来说不够。
因此,我正在寻找一种解决方案,可以通过命令行对运行中的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。
看起来在命令行中对Java应用程序进行分析的“内置”方法是使用分析命令行参数启动它,就像这样
$ java -Xrunhprof:cpu=samples,file=myprogram.hprof ...
您也可以使用“穷人的分析器”,通过收集大量的jstack并将它们转储到例如flamegraph或其他分析器/聚合器中来完成。
jstack
转储,就像我预期的那样,但它也不测量 CPU 消耗)。它有其他需要注意的地方 - 参见 http://www.brendangregg.com/blog/2014-06-09/java-cpu-sampling-using-hprof.html。 - Nickolay你能使用 jstack 收集10或20个堆栈样本吗?然后,如果 Foo 是一个方法,它的总时间使用率是包含它的样本的分数。它的 CPU 使用率是那些不以 I/O 或系统调用终止的样本的分数。它的“自身时间”是它本身是终点的样本的分数。
我不需要任何漂亮的东西。我要么在 IDE 下运行它并以这种方式收集它们,要么使用像 jstack 这样的东西快照正在运行的应用程序的堆栈。
这就是随机暂停技术。
最精确的剖析可通过https://github.com/jvm-profiling-tools/async-profiler实现。
该项目是一个Java的低开销采样剖析器,不会受到安全点偏差问题的影响。它具有HotSpot特定的API,用于收集堆栈跟踪和跟踪内存分配。该剖析器可与OpenJDK、Oracle JDK以及基于HotSpot JVM的其他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`
假设应用程序在同一用户下运行,并有单个Java进程PID需要由jps列出。
剖析持续时间为60秒。
无需修改应用程序的启动选项或重新启动应用程序。
IntelliJ IDEA Ultimate内置了用于检查转储的GUI:https://www.jetbrains.com/help/idea/cpu-profiler.html。
我们在服务器上使用hprof,它明显比sysouts更好,特别是当您无法运行完整的VisualVM会话时。
有很多使用hprof的示例:
hprof
不允许附加到进程。你最好去了解像 jprofile 和 jtop 这样的工具。http://java.sun.com/developer/technicalArticles/J2SE/monitoring/ - Sanjay T. Sharma对于“已启动”的JVM,一种分析性能的方法是聚合多个不同时刻获取的jstack。
例如,您可以将它们解析并显示为FlameGraph(有关详细信息,请参见该链接的各个答案,我这里不会重复包含)。
http://www.ej-technologies.com/products/jprofiler/overview.html
其他商业分析工具稳定可靠,但不是我最喜欢的,例如YourKIT。 那些较小的供应商制造了很好的工具。这些工具将为您提供有关方法计时、内存使用、GC等方面的大量信息,比jconsole更多。