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

时间:2011-07-27 14:25:49

标签: java command-line profiling

我经常使用VisualVM运行Java应用程序,但需要X才能在计算机上运行。

我知道我可以通过管理端口连接,但这将是一个离线采样分析,这对我来说还不够。

所以我正在寻找一种解决方案,我可以从命令行分析正在运行的Java应用程序的方法的CPU使用情况。这足以让我在服务器上收集数据,然后可以在不同的机器上分析收集的数据。

更新

似乎我需要更加具体。我想从命令行分析正在运行的Java应用程序,我不想阻止它并重新运行它。

7 个答案:

答案 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(它似乎附加到上一个输出文件)。或者等到进程退出并生成文件。

此(内置)分析器不经常进行样本,因此整体上通常具有较低的减速/影响。

参考:http://web.archive.org/web/20160623224137/https://thunderguy.com/semicolon/2004/04/18/profiling-a-java-program-easily/

答案 3 :(得分:5)

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

使用hprof的例子很多:

答案 4 :(得分:2)

您可以远程运行大多数商业资料管理器,以便在服务器上运行代理,然后通过开发计算机上的客户端连接到该代理。我最喜欢的探查器是JProfiler。这是相当合理的购买,而且非常稳定(并非所有的商业分析师都是如此)。

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

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

http://www.yourkit.com/

那些较小的供应商提供了很好的工具。这些工具将为您提供大量有关方法时序,内存使用,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